1

我有这个结构:

d = {
    "a": [1, 2, 3],
    "b": [4, 5, 6],
    "c": [7, 8, 9],
}

列表的长度保证匹配。我想要一个可以循环的迭代器,它将为列表中的每一列提供一个字典,有点像每次将 zip 转换回具有原始键名的字典,如下所示:

>>> for i in iDictOfListsToDicts(d):
...     print  i
{"a": 1, "b": 4, "c": 7}
{"a": 2, "b": 5, "c": 8}
{"a": 3, "b": 6, "c": 9}

我确信我可以在生成器函数中破解一些东西,但我觉得我错过了可能有两件事的紧密组合,可能来自集合和/或 itertools。如果可能的话,我想要体面的效率和可读性。

我一直在玩弄这样开始的事情:

map(iter, d.values())

显然,这只是给了我一个没有相关键的值的迭代器列表,但我仍然无法在该列表上进行循环并得到我想要的。

4

1 回答 1

1

使用zipmap与 一起使用None

>>> zip([1,2,3], [4,5,6], [7,8,9])
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
>>> map(None, [1,2,3], [4,5,6], [7,8,9])
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

尝试以下操作:

def iDictOfListsToDicts(d):
    keys = list(d)
    for vs in zip(*d.values()):
        yield dict(zip(keys, vs))

例子:

>>> d = {
...     "a": [1, 2, 3],
...     "b": [4, 5, 6],
...     "c": [7, 8, 9],
... }
>>> for i in iDictOfListsToDicts(d):
...     print i
... 
{'a': 1, 'c': 7, 'b': 4}
{'a': 2, 'c': 8, 'b': 5}
{'a': 3, 'c': 9, 'b': 6}
于 2013-09-27T08:41:23.393 回答