嵌套字典理解:要解压缩的值太多

时间:2017-07-01 18:37:24

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

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

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=yamkey未定义。

1 个答案:

答案 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