13

我正在尝试编写一个将表单字符串'A=5, b=7'转换为 dict的函数{'A': 5, 'b': 7}。以下代码片段是在主for循环内发生的 - 它们将字符串的单个部分转换为单个 dict 元素。

这可以:

s = 'A=5'
name, value = s.split('=')
d = {name: int(value)}

这不是:

s = 'A=5'
d = {name: int(value) for name, value in s.split('=')}
ValueError: need more than 1 value to unpack

为什么我不能在字典理解中解包元组?如果我得到这个工作,那么我可以轻松地将整个函数变成一个紧凑的 dict 理解。

4

7 回答 7

20

在您的代码中,s.split('=')将返回列表:['A', '5']。遍历该列表时,每次都会返回一个字符串(第一次是'A',第二次是'5'),因此您不能将该单个字符串解压缩为 2 个变量。

你可以试试: for name,value in [s.split('=')]

更有可能的是,您有一个要拆分的可迭代字符串——然后您的 dict 理解变得简单(2 行):

 splitstrs = (s.split('=') for s in list_of_strings) 
 d = {name: int(value) for name,value in splitstrs }

当然,如果你对 1-liners 很着迷,你可以把它结合起来,但我不会。

于 2012-08-23T15:10:26.290 回答
7

当然你可以这样做:

>>> s = 'A=5, b=7'
>>> {k: int(v) for k, v in (item.split('=') for item in s.split(','))}
{'A': 5, ' b': 7}

但在这种情况下,我只会使用这个更具命令性的代码:

>>> d = {}
>>> for item in s.split(','):
        k, v = item.split('=')
        d[k] = int(v)


>>> d
{'A': 5, ' b': 7}
于 2012-08-23T15:18:19.200 回答
5

有些人倾向于相信你会因为使用而下地狱eval,但是......

s = 'A=5, b=7'
eval('dict(%s)' % s)

或者更好的是,为了安全起见(感谢 mgilson 指出):

s = 'A=5, b=7'
eval('dict(%s)' % s, {'__builtins__': None, 'dict': dict})
于 2012-08-23T15:18:59.683 回答
2

这段代码怎么样:

a="A=5, b=9"
b=dict((x, int(y)) for x, y in re.findall("([a-zA-Z]+)=(\d+)", a))
print b

输出:

{'A': 5, 'b': 9}

此版本也适用于其他形式的输入,例如

a="A=5 b=9 blabla: yyy=100"

会给你

{'A': 5, 'b': 9, 'yyy': 100}
于 2012-08-23T15:13:39.520 回答
2

请参阅 mgilson 对错误发生原因的回答。为了实现你想要的,你可以使用:

d = {name: int(value) for name,value in (x.split('=',1) for x in s.split(','))}

要考虑空格,请.strip()根据需要使用(例如:)x.strip().split('=',1)

于 2012-08-23T15:14:32.077 回答
2
>>> strs='A=5, b=7'

>>> {x.split('=')[0].strip():int(x.split('=')[1]) for x in strs.split(",")}
{'A': 5, 'b': 7}

为了可读性,您应该使用普通的 for-in 循环而不是理解。

strs='A=5, b=7'
dic={}
for x in strs.split(','):
  name,val=x.split('=')
  dic[name.strip()]=int(val)
于 2012-08-23T15:18:16.827 回答
0

这个怎么样?

>>> s
'a=5, b=3, c=4'
>>> {z.split('=')[0].strip(): int(z.split('=')[1]) for z in s.split(',')}
{'a': 5, 'c': 4, 'b': 3}
于 2012-08-23T15:21:21.693 回答