[英]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
,这很好,但是key
和value
未定义。
您不能这样做:
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.