簡體   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