嵌套字典理解:值太多,无法取消

2024-04-24 09:20:06 发布

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

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

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)

我想替换这一行:

^{pr2}$

有了更好的字典理解功能,它可能看起来像:

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,这很好,但是key和{}是未定义的。在


Tags: key代码inimportfor字典valuewith
1条回答
网友
1楼 · 发布于 2024-04-24 09:20:06

你不能这样做:

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

因为这要求p.split()调用的每个结果都必须有两个元素。相反,您只需要一个长度可变的单个(字符串)元素序列。在

您必须先将p.split()包装成另一个iterable:

^{pr2}$

所以现在不是:

['key', 'value']

你会得到:

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

它只迭代一次,提供两个要解包的值。在

但是,您可以在这里使用dict()调用;它直接使用(key, value)对的iterable:

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

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

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

相关问题 更多 >