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

Posted

技术标签:

【中文标题】将“对”列表转换为字典字典?【英文标题】:Converting a list of "pairs" into a dictionary of dictionaries? 【发布时间】:2018-09-06 14:19:32 【问题描述】:

这个问题之前在这里被问过一个严重的错字: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。给定列表中的多个列表,如何“更新”字典?

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

【问题讨论】:

字典中不能有重复的键,所以你想要的结果不会发生。 @DSM 我明白了;让我编辑 字典中的键是唯一的 你可能会得到像:2:3: 2, 4: 1, 3:2: 2, 4: 1, 4:3: 1, 2: 1 这样更有意义的东西。 @DSM 我已经编辑了问题;抱歉,我没有想清楚 【参考方案1】:

对于嵌套列表示例,您可以使用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。对于平面列表,可以嵌套它们以保持代码完整。喜欢lst = [lst] if not isinstance(lst[0], list) else lst【参考方案2】:

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

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

【讨论】:

【参考方案3】:

使用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://***.com/a/52206554/8060120

【讨论】:

设置的原因是什么? 是dictk: 1 我说的是x for x in permutations([4,2,3]) 另外defaultdict 必须在某处初始化。您可能缺少一行 谢谢你的默认设置,当我搜索解决方案时,你是正确的。

以上是关于将“对”列表转换为字典字典?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字典列表转换为 JSON

将列表列表转换为Python中的字典字典

将标准 python 键值字典列表转换为 pyspark 数据框

Python 怎么将列表类字典组字符串转换为列表?

我想将字符串列表转换为字典列表

将列表转换为字典,然后通过键值将多个字典合并为一个字典