如何从字典(python)中以相反的顺序删除重复的键

时间:2018-02-05 20:02:56

标签: python dictionary

在下面的案例中,我正在努力从字典中删除相同的键:

{('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)}要合并或删除时,任何一个。

4 个答案:

答案 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}