Python - 在dict理解中解组的元组

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,你可以把它结合起来,但我不会.


jam*_*lak 6

当然你可以这样做:

>>> 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)

  • 我肯定会选择清晰、简单的函数版本,而不是我预计持续时间比单次运行更长的代码中的任何内联版本。它肯定更符合 Python 之禅。 (2认同)

slo*_*oth 5

有些人倾向于相信你会下地狱使用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)