从匹配长度列表的dict中迭代dicts

时间:2013-09-27 08:31:57

标签: python dictionary iteration

我有这个结构:

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

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

>>> 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())

显然,只是给我一个没有相关键的值的迭代器列表,但我仍然无法循环遍历该列表并获得我想要的内容。

1 个答案:

答案 0 :(得分:1)

使用zipmapNone

一起使用
>>> 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}