python - 嵌套字典理解 : Too many values to unpack

标签 python python-3.x dictionary dictionary-comprehension

我尝试重写以下代码以处理字典理解,只是为了好玩:

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: too many values to unpack (expected 2)

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

最佳答案

你不能这样做:

for key, value in 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) 对的迭代:

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

关于python - 嵌套字典理解 : Too many values to unpack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44864221/

相关文章:

python - Pandas:如何将字典映射到 2 列?

python - 如何从 Python 中的 SQLite3 数据库查询构建字典列表?

python - 如何为子类强制执行方法签名?

python - 如何在 Mac 上运行 redemo.py(或等效文件)?

python - 模板 django-simple-captcha?图像和输入字段之间的换行符

python - 在宠物示例中实现自定义负对数似然损失时遇到问题

python - 为什么这些函数相同,但输出不同的值?

Python集合操作remove(index)

python - 无法在 csv 文件中写入不同类型的项目

javascript - 从数组映射返回对象