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

将“成对”列表转换为词典?

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

    这个问题以前在这里被问到时有一个惊人的拼写错误: Counting "unique pairs" of numbers into a python dictionary?

    这是一个算法问题,我不知道最有效的解决办法。我的想法是以某种方式缓存列表中的值并枚举对…但那太慢了。我猜这里面有些有用的东西 itertools .

    list1 = [2, 3]   
    

    {2:{3: 1}, 3:{2: 1}}
    

    也就是说,有1对2-3和1对3-2。

    对于较大的列表,配对是相同的,例如。

    list2 = [2, 3, 4]
    

    {2:{3:1, 4:1}, 3:{2:1, 4:1}, 4:{3:1, 2:1}}
    

    (1) 一旦列表的大小变得更大,如何使用python数据结构在算法上找到这种格式的“唯一对”?

    (2) 我提到列表不能有重复的整数,例如。

    [2, 2, 3]
    

    是不可能的,因为有两个2。

    但是,可以有一个列表:

    list3 = [[2, 3], [2, 3, 4]] 
    

    {2:{3:2, 4:1}, 3:{2:2, 4:1}, 4:{2:1, 3:1}}
    

    因为有两对2-3和3-2。如果一个列表中有多个列表,如何“更新”词典?

    3 回复  |  直到 6 年前
        1
  •  3
  •   user2390182    6 年前

    对于嵌套列表示例,可以使用 itertools.permutations dict.setdefault :

    from itertools import permutations
    
    list3 = [[2, 3], [2, 3, 4]]
    
    d = {}
    for l in list3:
        for a, b in permutations(l, 2):
            d[a][b] = d.setdefault(a, {}).setdefault(b, 0) + 1
    
    # {2: {3: 2, 4: 1}, 3: {2: 2, 4: 1}, 4: {2: 1, 3: 1}}
    

    对于平面列表 l ,只使用内部循环,忽略外部循环

        2
  •  1
  •   N Chauhan Nathan Hinchey    6 年前

    values = [3, 2, 4]
    result = dict.from_keys(values)
    for key, value in result.items():
        value = {}
        for num in values:
            if num != key:
                value[num] = 1
    

    这将创建一个以每个数字为键的dict。现在在每个键中,使值成为嵌套的dict,其内容是 num: 1 对于原始值列表中的每个数字,如果它不是我们所在的键的名称

        3
  •  1
  •   Brown Bear    6 年前

    使用 defaultdict permutations

    from collections import defaultdict
    from itertools import permutations
    
    d = defaultdict(dict)
    for i in [x for x in permutations([4,2,3])]:
        d[i[0]] = {k: 1 for k in i[1:]}
    

    输出为

    In [22]: d
    Out[22]: defaultdict(dict, {2: {3: 1, 4: 1}, 4: {2: 1, 3: 1}, 3: {2: 1, 4: 1}})
    

    https://stackoverflow.com/a/52206554/8060120