繁体   English   中英

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

[英]Converting a list of “pairs” into a dictionary of dictionaries?

这个问题之前曾在这里提出过一个令人震惊的错字: 将数字中的“唯一对”计入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]

有dicitonary

{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。 如何在列表中给出多个列表“更新”字典?

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

对于嵌套列表示例,您可以使用itertools.permutationsdict.setdefault执行以下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 ,仅使用内部循环并省略外部循环

对于这个例子,我只使用带有直号的列表而没有嵌套列表:

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的嵌套字典。

使用defaultdict排列

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM