【问题标题】:iterating dicts out of a dict of matched-length lists从匹配长度列表的字典中迭代字典
【发布时间】:2013-09-27 08:31:56
【问题描述】:

我有这个结构:

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

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

【问题讨论】:

    标签: python dictionary iteration


    【解决方案1】:

    使用zip 或使用mapNone

    >>> 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}
    

    【讨论】:

    • 我使用的是 zip,但在摸索它周围的部分 :) 无论如何,就是这样。我知道有一个简单的小答案。谢谢。
    猜你喜欢
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    相关资源
    最近更新 更多