在下面的案例中,我正在努力从字典中删除相同的键:
{('cat', 'tiger'): 18,
('tiger', 'cat'): 18,
('chines', 'gentleman'): 7,
('gentleman', 'chines'): 7}
在这种情况下,我将反向订单('cat', 'tiger'): 18
和('tiger', 'cat'): 18
视为相同的密钥,并尝试制作如下所示的新字典
{('cat', 'tiger'): 18,
('gentleman', 'chines'): 7}
我正在尝试修改任何相反的顺序情况,当我有一个类似的字典,如{(('cage', 'cat'), 5),(('cat', 'cage'), 5)}
要合并或删除时,任何一个。
答案 0 :(得分:5)
你可以按照以下几点做点什么:
d = {('cat', 'tiger'): 18,
('tiger', 'cat'): 18,
('chines', 'gentleman'): 7,
('gentleman', 'chines'): 7}
result = {tuple(sorted(x)): y for x, y in d.items()}
# {('cat', 'tiger'): 18, ('chines', 'gentleman'): 7}
在这个dict
理解中,每组“相等”键的最后遇到的值获胜。对于您的样本数据,这应该无关紧要,因为这些键具有equla值。请注意,这也只是对元组进行排序,而不管原始dict
中实际出现的排序版本。
答案 1 :(得分:3)
问题是您使用tuple
值作为键,但tuple
个对象是有序的,因此('a','b')
与('b','a')
不同。简单的解决方案?使用无序但可清洗的容器,即冷冻装置可以工作:
>>> data = {('cat', 'tiger'): 18,
... ('tiger', 'cat'): 18,
... ('chines', 'gentleman'): 7,
... ('gentleman', 'chines'): 7}
>>>
>>> data
{('cat', 'tiger'): 18, ('tiger', 'cat'): 18, ('chines', 'gentleman'): 7, ('gentleman', 'chines'): 7}
>>> {frozenset(k):v for k,v in data.items()}
{frozenset({'cat', 'tiger'}): 18, frozenset({'gentleman', 'chines'}): 7}
答案 2 :(得分:1)
如果您不关心密钥中两个项目的顺序...并且与它们关联的值始终相同,则最简单的可能是,假设您的起始字典名为old_dict
:< / p>
new_dict = dict()
for (key, value) in old_dict.items():
new_dict[tuple(sorted(key))] = value
您只需遍历键/值对并将其添加到new_dict
。由于我们现在对键进行了排序,然后将结果列表转换回元组,我们确保重新出现的对象只会覆盖前一个条目。
答案 3 :(得分:0)
而不是从中删除项目,你可以拿走你想要的东西并留下休息。
data={('cat', 'tiger'): 18,
('tiger', 'cat'): 18,
('chines', 'gentleman'): 7,
('gentleman', 'chines'): 7}
track={}
for i,j in data.items():
track[tuple(sorted(i))]=j
print(track)
输出:
{('cat', 'tiger'): 18, ('chines', 'gentleman'): 7}