将复杂代码转换为列表失败

2024-04-26 20:20:42 发布

您现在位置:Python中文网/ 问答频道 /正文

NB:建议的答案都不适用于我,因为它们适用于循环驱动(我已经有了工作),并且没有解释列表理解版本的错误


我正在努力改变

('name:80', 'desc:100')

进入

{'name': 80, 'desc': 100}

工作for循环:

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

我做错了什么


Tags: 答案namein版本列表newfor错误
3条回答

您应该将拆分与转换为整型分开:

{k: int(v) for k, v in [w.split(":") for w in wrap]}
#{'name': 80, 'desc': 100}

但是,正如roganjosh正确地建议的那样,你从中一无所获

如果您希望坚持一个层次的理解,并且不介意使用Python 3.8+,那么您可以使用赋值表达式将拆分结果保存在一个用于索引的变量中:

{(t := s.split(':'))[0]: int(t[1]) for s in wrap}

你不想在^{上迭代,你想解压它。为此,可以引入嵌套的理解表达式或生成器表达式。这使您有机会创建新变量kv

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

相关问题 更多 >