【问题标题】:Converting a string to dictionary in python在python中将字符串转换为字典
【发布时间】:2012-06-14 06:53:59
【问题描述】:

我有以下字符串:

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

我想将以上内容转换为 python 中的字典数据类型,如下所示:

dict = {application.root.category.id:2}

我尝试使用 eval(),这是我得到的错误:

AttributeError: java package 'application' 没有属性“root”

我当前的 python 为 2.3。

有什么解决办法吗?

【问题讨论】:

  • 字典项的key应该是什么?
  • 你能解释一下java package的事情吗?
  • 您想要{application.root.category.id: 2} 还是{"application.root.category.id": 2}?您的问题是无法评估 application.root.category.id

标签: python python-2.3


【解决方案1】:

Python 字典的键不必是字符串;因此,当您编写{a: b} 时,如果它是一个字符串,则需要在a 周围加上引号。 (例如,{1:2}integer 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

【讨论】:

  • 出于安全原因,我宁愿使用int(v)eval(v,{},{}) 而不是普通的eval(v)。比较eval("os.remove('/tmp/a')", {}, {})(“名称'os'未定义”)和eval("os.remove('/tmp/a')")(“没有这样的文件或目录:'/tmp/a'”)。
  • 是的。通常使用eval(尤其是其简单的单参数形式)是一个坏主意。我只是懒惰地这样做了,因为 OP 做到了:-)。
【解决方案2】:

首先,'dict' 是类型名,因此不适合变量名。

以下内容完全按照您的要求执行...

a_dict = dict([str.strip('{}').split(":"),])

但是,如我所料,如果您想向字典添加更多映射,则需要采用不同的方法。

【讨论】:

    【解决方案3】:

    假设我有一个字符串

    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}

    【讨论】:

      猜你喜欢
      • 2011-06-10
      • 1970-01-01
      • 2018-05-19
      • 2013-03-13
      • 2017-03-23
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      • 2020-11-17
      相关资源
      最近更新 更多