在Python中将字符串转换为字典

4

I have the following string :

str = "{application.root.category.id:2}"

我希望将上面的内容转换为Python中的字典数据类型,如下所示:
dict = {application.root.category.id:2}

我尝试使用eval()函数,但出现了以下错误:

AttributeError: java包 'application' 没有属性 "root"

我的Python版本是<2.3,无法升级到>2.3。

有什么解决方案吗?


1
字典项的键应该是什么? - pepr
1
你能解释一下Java包(package)是什么吗? - wong2
1
你想要 {application.root.category.id: 2} 还是 {"application.root.category.id": 2}?你的问题在于无法评估 application.root.category.id - Eric
这个问题与任何特定版本无关。 - Karl Knechtel
3个回答

5
Python字典的键不一定是字符串;因此,当您编写{a:b}时,如果是字符串,您需要在其周围加上引号。例如,{1:2}将整数1映射到整数2。
因此,您不能只传递eval,而需要自己解析它。 (或者,如果更容易,可以更改生成它的任何内容以在键周围放置引号。)
如何解析它取决于您的字典可能实际上看起来像什么;例如,值本身可以是字典吗,还是始终是数字等?以下是一种简单而可能太粗略的方法:
contents = str[1:-1]        # strip off leading { and trailing }
items = contents.split(',') # each individual item looks like key:value
pairs = [item.split(':',1) for item in items] # ("key","value"), both strings
d = dict((k,eval(v)) for (k,v) in pairs) # evaluate values but not strings

3
еҮәдәҺе®үе…ЁиҖғиҷ‘пјҢжҲ‘жӣҙеҖҫеҗ‘дәҺдҪҝз”Ёint(v)жҲ–eval(v,{},{})иҖҢдёҚжҳҜеҚ•зәҜзҡ„eval(v)гҖӮжҜ”иҫғeval("os.remove('/tmp/a')", {}, {})пјҲ"name 'os' is not defined"пјүе’Ңeval("os.remove('/tmp/a')")пјҲ"No such file or directory: '/tmp/a'"пјүгҖӮ - daniel kullmann
3
是的。通常使用eval(特别是其简单的一参数形式)是一个坏主意。我只是因为OP这样做了而懒惰地这样做:-)。 - Gareth McCaughan

3
首先,'dict'是类型名称,因此不适合作为变量名。
接下来的代码,正如您所要求的那样...
a_dict = dict([str.strip('{}').split(":"),])

但是,如果像我预期的那样,您想向字典中添加更多的映射关系,就需要采取不同的方法。


0
假设我有一个字符串。
str='{1:0,2:3,3:4}'
str=str.split('{}')
mydict={}
for every in str1.split(','):
    z=every.split(':')
    z1=[]
    for every in z:
        z1.append(int(every))
    for k in z1:
        mydict[z1[0]]=z1[1]

输出: mydict {1: 0, 2: 1, 3: 4}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接