簡體   English   中英

Python Dictionary使用Lists作為值,查找具有相同值的其他鍵

[英]Python Dictionary using Lists as Values, find other Keys with same values

說我有以下字典。

>> sample_dict = {"1": ['a','b','c'], "2": ['d','e','f'], "3": ['g','h','a']}

我想找到一種方法來查看每個鍵的值,並返回值列表中是否有重復的變量。

例如,它會輸出:

>> [["1","3"] , ['a']]

我已經查看了這里的一些帖子並嘗試使用和/或更改它們來實現這一點,但是我找到的所有帖子都沒有按預期工作。 如果它如下,它們將起作用:

>> sample_dict = {"1": ['a','b','c'], "2": ['d','e','f'], "3": ['a','b','c']}

但如果列表中只有一個值相同,則不會。

您可以使用另一個字典將值映射到相應鍵的列表。 然后只需選擇映射到多個鍵的值,例如:

from collections import defaultdict

sample_dict = {'1': ['a','b','c'], '2': ['d','e','f'], '3': ['g','h','a']}    

d = defaultdict(list)  # automatically initialize every value to a list()

for k, v in sample_dict.items():
    for x in v:
        d[x].append(k)

for k, v in d.items():
    if len(v) > 1:
        print([v, k])

輸出:

[['1', '3'], 'a']

如果列表元素是可.setdefault ,則可以使用.setdefault構建反向映射,如下所示:

>>> sample_dict = {"1": ['a','b','c'], "2": ['d','e','f'], "3": ['g','h','a']}
>>> aux = {}
>>> for k, v in sample_dict.items():
...     for i in v:
...         aux.setdefault(i, []).append(k)
... 
>>> [[v, k] for k, v in aux.items() if len(v) > 1]
[[['1', '3'], 'a']]

字典從鍵映射到值,而不是從值映射到鍵。 但是你可以編寫一次性計算函數。 這將導致O( n )時間復雜度,不建議用於較大的詞典:

def find_keys(d, val):
    return [k for k, v in d.items() if val in v]

res = find_keys(sample_dict, 'a')  # ['1', '3']

如果你經常這樣做,我建議你通過collections.defaultdict “反轉”你的字典:

from collections import defaultdict

dd = defaultdict(list)

for k, v in sample_dict.items():
    for w in v:
        dd[w].append(k)

print(dd)

defaultdict(<class 'list'>, {'a': ['1', '3'], 'b': ['1'], 'c': ['1'], 'd': ['2'],
                             'e': ['2'], 'f': ['2'], 'g': ['3'], 'h': ['3']})

這會導致反轉的O( n )以及額外的內存,但現在允許您在O(1)時間內訪問與輸入值相關聯的鍵,例如dd['a']將返回['1', '3']

您可以使用collections模塊中的defaultdict來執行此操作

例如,

from collections import defaultdict
sample_dict = {"1": ['a','b','c'], "2": ['d','e','f'], "3": ['g','h','a']}

d = defaultdict(list)
for keys, vals in sample_dict.items():
    for v in vals:
        d[v].append(keys)


print(d)

d將返回一個dict ,其中鍵將是重復的值,值將是重復它們的列表

上面代碼的輸出是defaultdict(list,{'a': ['1', '3'],'b': ['1'],'c': ['1'],'d': ['2'],'e': ['2'],'f': ['2'],'g': ['3'],'h': ['3']})

雖然可以獲得您希望輸出的格式,但通常不推薦使用,因為我們試圖讓哪個字符在哪個列表中重復,這感覺就像字典的工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM