繁体   English   中英

嵌套字典理解:太多值无法解包

[英]Nested dictionary comprehension: Too many values to unpack

我尝试重写以下代码以与字典理解一起工作,只是为了好玩:

import itertools

with open('foo.txt') as f:
    entities = f.read().splitlines()

parsed_entities = []
while entities:
    props = itertools.takewhile(lambda n: n != 'EOM', entities)
    entity = {p.split('=')[0]: p.split('=')[1] for p in props}
    entities = entities[len(entity)+2:]  # Delete and skip EOM & newline
    parsed_entities.append(entity)

我要替换此行:

entity = {p.split('=')[0]: p.split('=')[1] for p in props}

具有更好看的字典理解,可能类似于:

entity = {key: value for p in props for key, value in p.split('=')}

当我尝试这样做时,出现以下错误:

ValueError:太多值无法解包(预期2)

我究竟做错了什么? 使用ipdb.pm()我看到p是name=yam ,这很好,但是keyvalue未定义。

您不能这样做:

for key, value in p.split('=')

因为这要求p.split()调用的每个结果都必须有两个元素。 取而代之的是,您只有一系列可变长度的单个(字符串)元素。

您必须p.split()包装到另一个可迭代的p.split()

entity = {key: value for p in props for key, value in (p.split('='),)}

所以现在代替:

['key', 'value']

你得到:

(['key', 'value'],)

它只迭代一次 ,提供两个值进行解压缩。

但是,您可以在此处使用可调用的dict() 它直接消耗(key, value)对的可迭代(key, value)

entity = dict(p.split('=') for p in props)

您还应尽量避免将整个文件读入内存,可以将文件直接用作可迭代文件:

from itertools import takewhile

parsed_entities = []
with open('foo.txt') as f:
    cleaned = (l.rstrip('\n') for l in f)
    while True:
        props = takewhile(lambda n: n != 'EOM', cleaned)
        parsed_entities.append(dict(p.split('=') for p in props))
        try:
            next(cleaned)  # consume line after EOM
        except StopIteration:
            # no more lines
            break

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM