将一个“对”列表转换为字典中的字典?

4
这个问题之前已经有人问过,但有一个明显的拼写错误:在Python字典中计算“唯一对”的数量? 这是一个算法问题,我不知道最有效的解决方法。我的想法是以某种方式在列表中缓存值并枚举成对的数字......但是这样太慢了。我猜想从itertools中可能会有用的东西。
假设我有一个整数列表,其中没有重复的数字:
list1 = [2, 3]   

在这种情况下,存在唯一的一对2-3和3-2,因此字典应为:
{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,如果在列表中有多个列表,如何“更新”字典?

编辑:我的最终用例是,我想遍历数百个整数列表,并创建一个包含成对“计数”的单个字典。这有意义吗?可能有另一种更有用的数据结构。


7
字典中不能有重复的键,因此你想要的结果是不会发生的。 - DSM
@DSM 我明白了,让我编辑一下。 - ShanZhengYang
字典中的键是唯一的。 - Brown Bear
1
你可能会得到类似这样的东西:{2:{3: 2, 4: 1}, 3:{2: 2, 4: 1}, 4:{3: 1, 2: 1}},这样更有意义。 - user2390182
@DSM 我已经编辑了问题;非常抱歉,当时思维不太清晰。 - ShanZhengYang
@schwobaseggl 这是正确的;请查看编辑 - ShanZhengYang
3个回答

3
对于嵌套列表的例子,您可以采用以下方法处理,利用 itertools.permutationsdict.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,只使用内部循环并省略外部循环。

1
这太美妙了+1。对于平面列表,可以将它们嵌套以保持代码完整,例如lst = [lst] if not isinstance(lst[0], list) else lst - Ma0

1

对于这个例子,我将只使用一个没有嵌套列表的直接数字列表:

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

这将创建一个字典,其中每个数字都是一个键。现在,在每个键中,将值设置为一个嵌套字典,其内容为原始值列表中的每个数字(如果它不是我们所在键的名称),格式为num: 1

1

使用defaultdictpermutations

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://dev59.com/a67la4cB1Zd3GeqPZDSx#52206554


设置的原因是什么? - Ma0
这是 k: 1 的字典。 - Brown Bear
1
我在谈论{x for x in permutations([4,2,3])} - Ma0
1
还有,defaultdict 必须在某个地方初始化。你可能漏掉了一行代码。 - Ma0
谢谢您的默认设置,您是正确的,当我在寻找解决方案时,该集合已经过度编码。 - Brown Bear

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接