簡體   English   中英

返回包含給定字典值的鍵的字典,反之亦然

[英]Return a dictionary with keys for a given dictionary's values and vice versa

在函數中,我如何創建一個字典,其中鍵是給定字典的值,反之亦然,其中給定字典每個鍵有多個值? 例如,給定一個字典:

d = {"1":["a","b"],"2":["b","a","c"],"3":["c","d"]}

我需要返回一個字典,如:

d2 = {"a":["1","2"],"b":["1","2"],"c":["2","3"],"d":["3"]}

我唯一的想法是列出所有值,然后手動檢查每個值的每個鍵,但我不知道如何在不知道鍵和值的數量的情況下這樣做。 任何幫助將非常感激。

嘗試:

{letter: [key for key in d if letter in d[key]] for letter in set(letter for key in d for letter in d[key])}

說明: set(letter for key in d for letter in d[key])是一組顯示在原始字典中的所有字母)。 然后我們創建一個新的dict,其中每個條目都是letter: [key for key in d if letter in d[key]]中的字母letter: [key for key in d if letter in d[key]] ,這意味着其中一個字母,映射到原始字典中映射到它的數字列表。

使用collections.defaultdict()默認為list

  • 在已排序的鍵/值對上循環
  • 價值物品的內部循環
  • 對於每個值項,使用原始dict鍵創建/更新列表

碼:

import collections

d3 = collections.defaultdict(list)

for k,v in sorted(d.items()):
    for vi in v:
        d3[vi].append(k)  # create list or append to existing list

print(dict(d3))

結果:

{'b': ['1', '2'], 'd': ['3'], 'c': ['2', '3'], 'a': ['1', '2']}
data = [(key, value) for key, values in d.items() for value in values]
d2 = defaultdict(list)

for value, key in data:
    d2[key].append(value)
    print(key, value)

這是我5年前找到的解決方案

from operator import itemgetter
from itertools import groupby
d = {'1': ['a', 'c'],'2': ['a', 'b', 'c'], '3': ['b']}
d2 = {x: [t[1] for t in group] for (x, group) in  groupby(sorted(((j, k) for k, v in d.items() for j in v), key=itemgetter(0)), key=itemgetter(0))}
# {'a': ['1', '2'], 'c': ['1', '2'], 'b': ['2', '3']}

暫無
暫無

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

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