将一个字典转换为另一个字典

4

我有一个字典,其中键是整数值,值是字符串列表。我想要将它反转,使得字符串成为键而整数成为值。

首先的设计:

{1:["a"], 2:["a","b"], 3:["a"], 4:["b", "cd"], 6:["a","cd"]}

第二个设计:

{"a": [1,2,3,6], "b":[2,4], "cd":[4,6]}

有什么线索吗?谢谢。

3
你试过任何事情吗? - Cory Madden
我认为这就是你要找的内容 [Invert Dictionary-python] (https://dev59.com/XF0b5IYBdhLWcg3wEdsx)。 - Gambit1614
@MohammedKashif,这个不同的地方在于列表中的值是唯一的。 - perigon
6个回答

3
一个简单的方法是创建一个 defaultdict,为新键提供一个空列表,然后对于当前字典中的每个列表,为每个元素创建一个键,并将原始字典键附加到新列表中:
from collections import defaultdict

orig = {1: ['a'], 2: ['a', 'b'], 3: ['a'], 4: ['b', 'cd'], 6: ['a', 'cd']}
d = defaultdict(list)

for k, v in orig.items():
    for string in v:
        d[string].append(k)

# d = {'a': [1, 2, 3, 6], 'b': [2, 4], 'cd': [4, 6]}

2

出于对一行代码的热爱(注意:非常低效!):

d2 = {val: [key for key in d if val in d[key]] for lst in d.itervalues() for val in lst}

2

代码

first_map = {1: ["a"], 2: ["a", "b"], 3: ["a"], 4: ["b", "cd"], 6: ["a", "cd"]}
second_map = {}
for key, value in first_map.items():
    for i in value:
        if i in second_map:
            second_map[i].append(key)
        else:
            second_map[i] = [key]
print(second_map)

1
z = {1:["a"], 2:["a","b"], 3:["a"], 4:["b", "cd"], 6:["a","cd"]}
d = dict()

for k, v in z.iteritems():
    for i in v: 
        if i in d: 
            d[i].append(k)
        else:   
            d[i] = [k]

使用iteritems()代替items()在Python 2中更好一些,因为前者创建了一个生成器。


1
也许更好使用iteritems,因为OP指出了Python 2.7? - perigon

1
dict1= {1:["a"], 2:["a","b"], 3:["a"], 4:["b", "cd"], 6:["a","cd"]}
dict2= {}
for key, value in dict1.items():
   for val in value:
       if val in dict2:
           dict2[val].append(key)
           dict2[val]= list(set(dict2[val]))
       else:
           dict2[val]= [key]

1
from collections import defaultdict

second_dict = defaultdict(list)

for key, value in first_dict.items():

    for item in value:

        second_dict[item].append(key)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接