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

展开python字典以表示共享列表值

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

    假设我在Python3.x中有以下简单词典:

    example = {1:[4, 5, 6], 2:[7, 8, 9]}
    

    我想用以下方法扩充词典:

    expanded_example = {1:[4, 5, 6], 2:[7, 8, 9], 4:[5, 6], 5:[4, 6], 6:[4, 5], 7:[8, 9], 8:[7, 9], 9:[7, 8]}
    

    由于多个键共享值,这变得相当复杂。举个例子,

    example2 = {1:[4, 5, 6], 2:[4, 7, 8, 9]}
    

    这里4是与1和2相关联的列表中的值。

    如果存在“重复”值元素,有两种方法:

    {1:[4, 5, 6], 2:[4, 7, 8, 9], 4:[5, 6], 5:[4, 6], 6:[4, 5], 7:[8, 9], 8:[7, 9], 9:[7, 8]}
    

    (2) 保留所有关联的值(因为“4”在键“1”和“2”之间共享):

    {1:[4, 5, 6], 2:[4, 7, 8, 9], 4:[5, 6, 7, 8, 9], 5:[4, 6], 6:[4, 5], 7:[4, 8, 9], 8:[4, 7, 9], 9:[4, 7, 8]}
    

    编辑时间:

    collections.defaultdict :

    from collections import defaultdict
    dict1 = {1:[4, 5, 6], 2:[4, 7, 8, 9]}
    d_dict = defaultdict(list)
    
    for k,l in dict1.items():
        for v in l:
            d_dict[v].append(l)
    
    print(d_dict)
    ## defaultdict(<class 'list'>, {4: [[4, 5, 6], [4, 7, 8, 9]], 5: [[4, 5, 6]], 6: [[4, 5, 6]], 7: [[4, 7, 8, 9]], 8: [[4, 7, 8, 9]], 9: [[4, 7, 8, 9]]})
    

    这让我明白了一些方法,但是列表中有重复的元素。。。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Tanmay jain    6 年前

    策略2

    example2 = {1:[4, 5, 6], 2:[4, 7, 8, 9]}
    output = {**example2}
    
    for val in example2.values():
        for idx,v in enumerate(val):
            if v not in output:
                output[v] = val[0:idx]+val[idx+1:]
            else:
                output[v].extend(val[0:idx]+val[idx+1:])
    
    print(output)
    #{1: [4, 5, 6], 2: [4, 7, 8, 9], 4: [5, 6, 7, 8, 9], 5: [4, 6], 6: [4, 5], 7: [4, 8, 9], 8: [4, 7, 9], 9: [4, 7, 8]}
    

    策略1

    import copy
    example2 = {1:[4, 5, 6], 2:[4, 7, 8, 9]}
    output = copy.deepcopy(example2)
    
    for val in example2.values():
        for num in val:
            if num in output:
                val.remove(num)
    
        for idx,v in enumerate(val):
            output[v] = val[0:idx]+val[idx+1:]
    
    print(output)
    #{1: [4, 5, 6], 2: [4, 7, 8, 9], 4: [5, 6], 5: [4, 6], 6: [4, 5], 7: [8, 9], 8: [7, 9], 9: [7, 8]}
    
        2
  •  2
  •   jpp    6 年前

    注: 这个答案只涉及方法1。

    d = {1:[4, 5, 6], 2:[7, 8, 9]}
    
    for k, v in list(d.items()):
        for w in v:
            L = v.copy()
            d[L.pop(L.index(w))] = L
    
    print(d)
    
    {1: [4, 5, 6], 2: [7, 8, 9], 4: [5, 6], 5: [4, 6],
     6: [4, 5], 7: [8, 9], 8: [7, 9], 9: [7, 8]}