[英]How to remove duplicated keys in reverse order from dictionary (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)}
或删除,一个。
您可以按照以下方式进行操作:
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
理解中,每组“相等”键的最后遇到的值将获胜。 对于您的样本数据,这无关紧要,因为这些键具有等效值。 请注意,这也只是对元组进行排序,而不管原始dict
实际出现的排序版本如何。
问题是您使用tuple
值作为键,但是tuple
对象是有序的,因此('a','b')
与('b','a')
。 一个简单的解决方案? 使用无序但可哈希的容器,即,可使用Frozenset:
>>> 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
。 由于我们现在对键进行了排序,然后将结果列表返回到元组,因此,我们确保不会再出现任何一对夫妇覆盖先前的条目。
除了从中删除项目,您还可以随心所欲地休息。
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}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.