代码之家  ›  专栏  ›  技术社区  ›  ShanZhengYang

对于列表列表,请将字典与collections.defaultdict合并

  •  1
  • ShanZhengYang  · 技术社区  · 6 年前

    collections.defaultdict . 这是为了帮助我了解它是如何工作的。

    这个问题是从这个有用的问题推断出来的: How to merge a list of multiple dictionaries into a dictionary of lists?

    list_of_dictionaries2 = [[{0:3523, 1:3524, 2:3540, 4:3541, 5:3542}, 
        {0:7245, 1:7246, 2:7247, 3:7248, 5:7249, 6:7250},
        {1:20898, 2:20899, 3:20900, 4:20901, 5:20902}], [{0:3, 1:4, 2:5, 3:6}]]
    

    预期的答案是:

    correct2 = [[{0:[3523, 7245], 1:[3524, 7246, 20898], 2:[3540, 7247, 20899], 
                3:[7248, 20900], 4:[3541, 20901], 5:[3542, 7249, 20902], 6:[7250]}], 
                [{0:3, 1:4, 2:5, 3:6}]]
    

    以前,对于一个字典列表,我们通过创建一个默认值为列表的空字典来解决这个问题,即 collections.defaultdict(list) .

    假设这个例子是一个列表列表,我认为另一个for循环就是解决方案,将字典附加到一个空列表中:

    from collections import defaultdict
    correct2 = defaultdict(list)
    
    empty = []
    
    for smaller_list in list_of_dictionaries2:
        for d in smaller_list:
            for k,v in d.items():
                correct2[k].append(v)
        empty.append(correct2)
    

    >>> print(empty)
    [defaultdict(<class 'list'>, {0: [3523, 7245, 3], 1: [3524, 7246, 20898, 4], 
    2: [3540, 7247, 20899, 5], 4: [3541, 20901], 5: [3542, 7249, 20902], 
    3: [7248, 20900, 6], 6: [7250]}), defaultdict(<class 'list'>, 
    {0: [3523, 7245, 3], 1: [3524, 7246, 20898, 4], 2: [3540, 7247, 20899, 5], 
    4: [3541, 20901], 5: [3542, 7249, 20902], 3: [7248, 20900, 6], 6: [7250]})]
    

    好像所有的字典都是合起来的。有两份。这不是我想要的。

    如何为每个单独的列表执行此操作,如上面所示?我的理解错在哪里?

    2 回复  |  直到 6 年前
        1
  •  2
  •   blhsing    6 年前

    defaultdict 在遍历主列表的循环中:

    empty = []
    for smaller_list in list_of_dictionaries2:
        correct2 = defaultdict(list)
        for d in smaller_list:
            for k,v in d.items():
                correct2[k].append(v)
        empty.append(correct2)
    

    empty 将变成:

    [defaultdict(<class 'list'>, {0: [3523, 7245], 1: [3524, 7246, 20898], 2: [3540, 7247, 20899], 4: [3541, 20901], 5: [3542, 7249, 20902], 3: [7248, 20900], 6: [7250]}), defaultdict(<class 'list'>, {0: [3], 1: [4], 2: [5], 3: [6]})]

    请注意,第二次合并的预期输出 不正确,因为每个键的值在合并后都应该是一个列表。字典列表也应该变成 默认dict 合并后的列表列表,而不是 默认dict

        2
  •  1
  •   Kr.98    6 年前

    你应该初始化 correct2 每一个这样的循环

    for smaller_list in list_of_dictionaries2:
        correct2 = defaultdict(list)
        for d in smaller_list:
            for k, v in d.items():
                correct2[k].append(v)
        empty.append(correct2)
    

    将被淘汰

    [defaultdict(<class 'list'>, {0: [3523, 7245], 1: [3524, 7246, 20898],
    2: [3540, 7247, 20899], 4: [3541, 20901], 5: [3542, 7249, 20902], 
    3: [7248, 20900], 6: [7250]}), 
    defaultdict(<class 'list'>, {0: [3],1: [4], 2: [5], 3: [6]})]