交换字典键和值,当值为列表时,项目不是唯一的



设置

我有一个大型词典,列表中的唯一键,独特的值和非唯一值。

字典看起来像

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

问题

我想交换键和值,以至于

d_inverse = {'1': ['a', 'b', 'c'], '2': ['a'],'3': ['a', 'c']}

我找到了以下有关交换密钥和值的答案,

  • python反向/倒映射

以及与列表中的值交换密钥,

  • 交换字典键和值当值为列表

最后一个答案是接近的,但没有管理列表中的非唯一值。

就是

{k: oldk for oldk, oldv in d.items() for k in oldv}

产生

{'1': 'c', '2': 'a', '3': 'c'}

我如何解释非唯一的价值,而不会丢失信息?

一种方法是使用 collections.defaultdict

d = {'a': ['1','2','3'],'b': ['1'],'c': ['1','3']}
from collections import defaultdict
d_dict = defaultdict(list)
for k,v in d.items():
    for i in v:
        d_dict[i].append(k)
dict(d_dict)
#{'1': ['a', 'b', 'c'], '2': ['a'], '3': ['a', 'c']}

使用for-loop

d = {'a': ['1','2','3'],'b': [1],'c': ['1','3']}
res = {}
for k,v in d.items():           #Iterate dictionary.
    for i in v:                 #Iterate List
        i = str(i)              #Convert element to string
        if i not in res:        #Check if key in dictionary.
            res[i] = [k]
        else:
            res[i].append(k)    #Else append element. 
print(res)

输出:

{'1': ['a', 'c', 'b'], '3': ['a', 'c'], '2': ['a']}

有人在这里回答了这个问题

inv_map = {}
for k, v in my_map.iteritems():
    inv_map.setdefault(v, []).append(k)

有了一个小的变化,它可以按照我们的意愿工作:

d = {'a': ['1','2','3'],'b': ['1'],'c': ['1','3']}
inv_map = {}
for k, vs in d.items():
    for v in vs:
        inv_map.setdefault(v, []).append(k)

print(inv_map)
>>> {'1': ['a', 'b', 'c'], '2': ['a'], '3': ['a', 'c']}

您也可以使用字典理解:

from string import ascii_lowercase as alphabet
d = {'a': ['1','2','3'],'b': ['1'],'c': ['1','3']}
new_d = {str(alphabet.index(a)+1):[alphabet[int(i)-1] for i in b] for a, b in d.items()}

输出:

{'1': ['a', 'b', 'c'], '2': ['a'], '3': ['a', 'c']}

最新更新