此问题以前曾在这里以错别字问:Counting "unique pairs" of numbers into a python dictionary?
这是一个算法问题,我不知道最有效的解决方案。我的想法是以某种方式将值缓存在列表中并枚举对……但这太慢了。我猜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。给定一个列表中的多个列表,如何“更新”字典?
编辑:我的最终用例是,我要遍历数百个整数列表,并使用成对的“计数”创建一个字典。这有意义吗?可能还有另一个更有用的数据结构。
答案 0 :(得分:3)
对于嵌套列表示例,可以使用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
,仅使用内部循环,而忽略外部循环
答案 1 :(得分: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
这将创建一个以每个数字为键的字典。现在,在每个键中,如果不是我们所在键的名称
,则将值设为嵌套dict,对于原始值列表中的每个数字,其内容均为num: 1
答案 2 :(得分:1)
将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}})