在以下情况下,我正在努力从字典中删除相同的键:
{('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)}被合并或删除时,任一种。
发布于 2018-02-06 04:09:05
您可以按照以下方式做一些事情:
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中。
发布于 2018-02-06 04:14:17
问题是您使用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}发布于 2018-02-06 04:12:26
如果你不关心密钥中两个项目的顺序...并且与它们相关联的值总是相同的,最简单的可能是,假设您的起始字典名为old_dict
new_dict = dict()
for (key, value) in old_dict.items():
new_dict[tuple(sorted(key))] = value您只需遍历键/值对并将它们添加到new_dict中。由于我们现在对键进行了排序,然后将结果列表转换回元组,因此我们确保任何重新出现的对只会覆盖之前的条目。
https://stackoverflow.com/questions/48630570
复制相似问题