我尝试重写以下代码以处理字典理解,只是为了好玩:
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
,这很好,但是 key
和 value
未定义。
最佳答案
你不能这样做:
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/