我写了下面的代码,我不明白为什么我的字典和列表一起被删除了。真的希望你能帮我。我被困在这里了。
这是我的代码:
course_dict = {'I': 3, 'love': 3, 'self.py!': 2}
save_dict = {}
def inverse_dict(Recived_dict):
global save_dict
list_counter = 0
new_dict = {}
my_list = []
current_value = list(Recived_dict.values())[0]
for key, value in Recived_dict.items():
if value == current_value:
my_list.append(key)
new_dict[value] = my_list
save_dict = new_dict
else:
if list_counter == 0:
del my_list[0:]
list_counter =1
my_list.append(key)
new_dict[value] = my_list
print(new_dict)
inverse_dict(course_dict)
由于您的值不是唯一的,因此您需要一种方法来聚合与原始值对应的原始键。您可以从包含新键和值的空白列表的字典开始,然后append
新值:
course_dict = {'I': 3, 'love': 3, 'self.py!': 2}
def inverse_dict(Recived_dict):
new_dict = {v: [] for v in Recived_dict.values()}
for k, v in Recived_dict.items():
new_dict[v].append(k)
print(new_dict)
inverse_dict(course_dict)
{3: ['I', 'love'], 2: ['self.py!']}
假设您希望能够使用这个新字典,您的函数可能应该return
反转字典:
def inverse_dict(Recived_dict):
new_dict = {v: [] for v in Recived_dict.values()}
for k, v in Recived_dict.items():
new_dict[v].append(k)
return new_dict
course_dict = {'I': 3, 'love': 3, 'self.py!': 2}
save_dict = inverse_dict(course_dict)
print(save_dict)
{3: ['I', 'love'], 2: ['self.py!']}
defaultdict
将使这更容易。
from collections import defaultdict
a = {3: 'foo', 5: 'foo', 4: 'bar'}
d = defaultdict(list)
for k, v in a.items():
d[v].append(k)
结果:
defaultdict(<class 'list'>, {'foo': [3, 5], 'bar': [4]})
您也可以使用itertools.groupby
。
>>> from itertools import groupby
>>> from operator import itemgetter
>>> a = {3: 'foo', 5: 'foo', 4: 'bar'}
>>> {k: [b for b, _ in v]
... for k, v in groupby(
... sorted(
... a.items(),
... key=itemgetter(1)
... ),
... key=itemgetter(1)
... )}
{'bar': [4], 'foo': [3, 5]}