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

如何展开基于键值“对”的python列表字典?

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

    假设我有以下Python字典:

    dict1 = {1:[4, 12, 22], 2:[4, 5, 13, 23], 3:[7, 15, 25]}
    

    钥匙 1 与价值关联 [4, 12, 22] 表示1与4“相关”。1也与12相关,1与22相关。另外,2与4相关联,2与5相关联,2与13相关联,1与23相关联,等等。

    我的问题是,对于这个小例子,如何“展开”这个字典,使值列表的每个元素都编码这个“关联”?

    也就是说,最终结果应该是:

    intended_dict = {1:[4, 12, 22], 2:[4, 5, 13, 23], 3:[7, 15, 25], 
                         4:[1, 2], 5:[2], 12:[1], 13:[2], 15:[3], 22:[1], 23:[2], 25:[3]}
    

    这将如何扩展到一个包含数百万整数的更大列表的更大字典?

    也许另一种数据结构在这里会更有效,特别是对于更大的列表?

    编辑:考虑到我正在使用的实际词典的大小(而不是上面发布的),解决方案应该尽可能地提高内存/性能效率。

    4 回复  |  直到 6 年前
        1
  •  1
  •   U13-Forward    6 年前

    newdict={v:[i for i in dict1.keys() if v in dict1[i]] for k,v in dict1.items() for v in v}
    print(newdict)
    

    输出:

    {4: [1, 2], 12: [1], 22: [1], 5: [2], 13: [2], 23: [2], 7: [3], 15: [3], 25: [3]}
    

    要合并它们:

    print({**dict1,**newdict})
    
        2
  •  1
  •   blhsing    6 年前

    以下操作将完成:

    intended_dict = dict1.copy()
    for k, v in dict1.items():
        for i in v:
            intended_dict.setdefault(i, []).append(k)
    
        3
  •  1
  •   Transhuman    6 年前

    collections.defaultdict

    from collections import defaultdict
    dict1 = {1:[4, 12, 22], 2:[4, 5, 13, 23], 3:[7, 15, 25]}
    d_dict = defaultdict(list)
    
    for k,l in dict1.items():
        for v in l:
            d_dict[v].append(k)
    
    intended_dict = {**dict1, **d_dict}
    print (intended_dict)
    #{1: [4, 12, 22], 2: [4, 5, 13, 23], 3: [7, 15, 25], 4: [1, 2], 12: [1], 22: [1], 5: [2], 13: [2], 23: [2], 7: [3], 15: [3], 25: [3]}
    
        4
  •  1
  •   Denziloe    6 年前

    你基本上是在储存关系。这有一个完整的领域——它们存储在关系数据库中,其中包含 . 在Python中,更自然的做法是将其作为一个由两个列表组成的列表,或者,由于您的关系是对称的,并且顺序无关紧要,所以将其作为一个由两个集合组成的列表。一个更好的解决方案是 pandas 这是在Python中执行表的规范包。

    目前,这里是如何把你原来的东西变成一个

    import pandas as pd
    
    dict1 = {1:[4, 12, 22], 2:[4, 5, 13, 23], 3:[7, 15, 25]}
    
    relations = pd.DataFrame(
        [[key, value] for key, values in dict1.items() for value in values]
    )
    
    print(relations)
    
    Out:
       0   1
    0  1   4
    1  1  12
    2  1  22
    3  2   4
    4  2   5
    5  2  13
    6  2  23
    7  3   7
    8  3  15
    9  3  25
    
    result = {
        **{key: list(values) for key, values in relations.groupby(0)[1]},
        **{key: list(values) for key, values in relations.groupby(1)[0]}
    }
    
    print(result)
    
    Out:
    {1: [4, 12, 22],
     2: [4, 5, 13, 23],
     3: [7, 15, 25],
     4: [1, 2],
     5: [2],
     7: [3],
     12: [1],
     13: [2],
     15: [3],
     22: [1],
     23: [2],
     25: [3]}