Ben*_*son 12 python dictionary dictionary-comprehension iterable-unpacking
我正在尝试编写一个函数,将表单的字符串'A=5, b=7'转换为字典{'A': 5, 'b': 7}.以下代码片段是主for循环内部发生的- 它们将字符串的单个部分转换为单个dict元素.
这可以:
s = 'A=5'
name, value = s.split('=')
d = {name: int(value)}
Run Code Online (Sandbox Code Playgroud)
这不是:
s = 'A=5'
d = {name: int(value) for name, value in s.split('=')}
ValueError: need more than 1 value to unpack
Run Code Online (Sandbox Code Playgroud)
为什么我不能在字典理解中解包元组?如果我得到这个工作,那么我可以轻松地将整个功能变成一个紧凑的字典理解.
mgi*_*son 18
在您的代码中,s.split('=')将返回列表:['A', '5'].迭代该列表时,每次返回一个字符串(第一次'A',第二次返回'5'),因此您无法将该单个字符串解压缩为2个变量.
你可以尝试: for name,value in [s.split('=')]
更有可能的是,你有一个你想要分割的可迭代字符串 - 然后你的字典理解变得简单(2行):
splitstrs = (s.split('=') for s in list_of_strings)
d = {name: int(value) for name,value in splitstrs }
Run Code Online (Sandbox Code Playgroud)
当然,如果你沉迷于1-liners,你可以把它结合起来,但我不会.
当然你可以这样做:
>>> s = 'A=5, b=7'
>>> {k: int(v) for k, v in (item.split('=') for item in s.split(','))}
{'A': 5, ' b': 7}
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,我只会使用这个更强制性的代码:
>>> d = {}
>>> for item in s.split(','):
k, v = item.split('=')
d[k] = int(v)
>>> d
{'A': 5, ' b': 7}
Run Code Online (Sandbox Code Playgroud)
有些人倾向于相信你会下地狱使用eval,但......
s = 'A=5, b=7'
eval('dict(%s)' % s)
Run Code Online (Sandbox Code Playgroud)
或者更好,为了安全(感谢mgilson指出它):
s = 'A=5, b=7'
eval('dict(%s)' % s, {'__builtins__': None, 'dict': dict})
Run Code Online (Sandbox Code Playgroud)