我尝试重写以下代码以使用字典理解,只是为了好玩:
System.IO.File.ReadAllText ("fileurl")
我想替换这一行:
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}
当我尝试这样做时,我收到以下错误:
ValueError:解压缩的值太多(预期2)
我做错了什么?使用entity = {key: value for p in props for key, value in p.split('=')}
我看到p为ipdb.pm()
,这很好,但name=yam
和key
未定义。
答案 0 :(得分:6)
你不能这样做:
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