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

2024-10-06 11:22:34 发布

您现在位置:Python中文网/ 问答频道 /正文

在以下情况下,我正在努力从字典中删除相同的键:

{('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)}的字典要合并或删除时,我尝试的是调整任何逆序大小写。你知道吗


Tags: 字典情况cattigercage本例倒序gentleman
3条回答

你可以按照以下思路做一些事情:

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理解中,最后遇到的每一组“equal”键的值获胜。对于示例数据,这应该无关紧要,因为这些键具有equala值。请注意,这也只是对元组进行排序,而与原始dict中实际出现的排序版本无关。你知道吗

问题是使用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}

如果你不在乎这两项的顺序。。。与它们相关联的值总是相同的,最简单的可能是,假设您的起始字典名为old_dict

new_dict = dict()
for (key, value) in old_dict.items():
    new_dict[tuple(sorted(key))] = value

您只需遍历键/值对并将它们添加到new_dict。因为我们现在对键进行排序,然后将结果列表转换回tuple,所以我们确保任何重新出现的一对都会覆盖上一个条目。你知道吗

相关问题 更多 >