Python 将复杂代码转换为列表失败
NB:建议的答案都不适用于我,因为它们适用于循环驱动(我已经有了工作),并且没有解释列表理解版本的错误Python 将复杂代码转换为列表失败,python,list-comprehension,Python,List Comprehension,NB:建议的答案都不适用于我,因为它们适用于循环驱动(我已经有了工作),并且没有解释列表理解版本的错误 我正在努力改变 ('name:80', 'desc:100') 进入 用于-循环的工作: new_wrap = {} for item in wrap: k, v = item.split(':') new_wrap[k] = int(v) wrap = new_wrap 非工作列表理解: wrap = dict([ (k, int(v)) for ite
我正在努力改变
('name:80', 'desc:100')
进入
用于-循环的工作:
new_wrap = {}
for item in wrap:
k, v = item.split(':')
new_wrap[k] = int(v)
wrap = new_wrap
非工作列表理解:
wrap = dict([
(k, int(v))
for item in wrap
for (k, v) in item.split(':')
])
给
Traceback (most recent call last):
File ..., line ..., in ...
for (k, v) in item.split(':')
ValueError: too many values to unpack
我做错了什么?您应该将拆分与转换为int分开:
{k: int(v) for k, v in [w.split(":") for w in wrap]}
#{'name': 80, 'desc': 100}
但是,正如roganjosh正确地建议的那样,您从中什么也得不到。您不想迭代项。拆分(“:”)
,您想解包它。为此,可以引入嵌套的理解表达式或生成器表达式。这使您有机会创建新变量k
和v
:
dict([
(k, int(v))
for k,v in (item.split(':') for item in wrap)
])
然后我会去掉方括号。更有效的方法是使用一个生成器表达式动态生成条目,而不是使用一个列表理解在内存中构建一个完整的列表,以便在创建dict时将其丢弃
dict((k, int(v))
for k,v in (item.split(':') for item in wrap))
通过使用带花括号的dict理解,您可以进一步简化它:
{k: int(v) for k,v in (item.split(':') for item in wrap)}
如果您希望坚持一个层次的理解,并且不介意使用Python 3.8+,那么您可以使用赋值表达式将拆分结果保存在一个用于索引的变量中:
{(t := s.split(':'))[0]: int(t[1]) for s in wrap}
有了约翰·库格曼(John Kugelman)提供的洞察力,我能够找出问题和我想要的解决方案
来自for
循环的工作代码:
k, v = item.split(':')
细分:
item.split(“:”)==“name:80”。split(“:”)==“name”,“80”
k,v='name','80'
k=='name'和v==80
列表comp
中的非工作代码:
for (k, v) in item.split(':')
[
(k, int(v))
for item in wrap
for (k, v) in (item.split(':'), )
]
细分:
item.split(“:”)==“name:80”。split(“:”)==“name”,“80”
用于('name','80')中的(k,v)
问题是:
中的与=
不同<在
中,code>迭代其参数,每次返回一个参数,因此:
是尝试的,因为四个项目试图塞进两个,所以我们得到了k,v='n'、'a'、'm'、'e'
异常ValueError:太多的值无法解包
item.split()
封装到自己的元组中:
对于k,v in(item.split(':'),)
用于k,v in(('name','80'),)
用于第二个k,v='name','80'
循环的第一次(也是唯一一次)迭代
列表comp
嵌套在主列表comp
中的情况下,问题得以解决
最终工作列表组件
:
for (k, v) in item.split(':')
[
(k, int(v))
for item in wrap
for (k, v) in (item.split(':'), )
]
我找到了这个解决方案:
x=('name:80','desc:100')
dict([tuple(a.split(':')表示x中的a])
dict(map('{:s}:{:d}.parse,wrap))
。我希望如此!:)(甚至不是开玩笑,我本可以经常使用它)@StefanPochmann你可以用它来接近它。它不会在str
上monkeypatch一个方法,但它会足够好:dict(parse({}:{:d}',w)。在wrap中修复了w)
@wim很好,尽管我认为大多数情况下我都是这样,我不想告诉人们安装它(除非他们的问题是关于字符串解析的)。这回答了你的问题吗?另外:这不会将字符串“80”
转换为数字80
。更改第二行:dict([tuple([a.split(':')[0],int(a.split(':')[1])表示x中的a])这很酷,但我不想在生产代码中看到它;;-)无论出于什么原因,你都必须坚持你的清单理解,但与@johnkugelman的答案中提供的听写理解相比,这既不可读又难看。哪个应该是被接受的答案呢?@Jeronimo:list comp显示在末尾,因为这就是问题所在,我可以在这里展示解决方案。实际使用的代码确实使用了John Kugelman概述的dict/生成器方法。约翰得到了赏金,因为他的回答解释了我做错了什么;这是公认的答案,因为它详细说明了什么地方出了问题,为什么出了问题,并且有一个解决方案,不能将一种理解嵌套在另一种理解中。