Python:比较字典键

Python:比较字典键,python,dictionary,Python,Dictionary,我有一个字典,它有两个键来标识一组数据。密钥当前存储为置换(因此密钥1,2存在,密钥2,1存在,即使它们具有相同的数据) 我想消除重复的值 例如: 我有这个(其中key1,key2重复为key2,key1) 我想要一个 dict = {'key1, key2':1,'key2, key3':2} 有什么想法吗?确实dict(“,”。join(sorted(k.split(“,”),v)for k,v in d.iteritems())做你想做的事吗?确实dict(“,”。join(sorted

我有一个字典,它有两个键来标识一组数据。密钥当前存储为置换(因此密钥1,2存在,密钥2,1存在,即使它们具有相同的数据)

我想消除重复的值

例如:

我有这个(其中key1,key2重复为key2,key1)

我想要一个

dict = {'key1, key2':1,'key2, key3':2}

有什么想法吗?

确实
dict(“,”。join(sorted(k.split(“,”),v)for k,v in d.iteritems())
做你想做的事吗?

确实
dict(“,”。join(sorted(k.split(“,”),v)for k,v in d.iteritems())
做你想做的事吗?

首先,千万不要把
dict
作为变量名,它会给建筑物蒙上阴影

您可以使用任何不可变对象作为字典键,因此像
frozenset
这样的集合可能比字符串更适合您的用例:

>>> data = {'key1, key2':1, 'key2, key3':2, 'key2, key1':1}
>>> new_data = {
  frozenset(item.strip() for item in key.split(',')): val 
  for key, val in data.items()
}
>>> new_data

{frozenset({'key1', 'key2'}): 1, 
 frozenset({'key2', 'key3'}): 2}
如果确实需要将键设置为字符串:

>>> {", ".join(key): val for key, val in new_data.items()}

{'key2, key1': 1, 'key3, key2': 2}
[更新]

使用Achim建议的排序元组:

>>> new_data = {
  tuple(sorted(item.strip() for item in key.split(','))): val
  for key, val in data.items()
}
>>> new_data

{('key1', 'key2'): 1, ('key2', 'key3'): 2}

>>> {", ".join(key): val for key, val in new_data.items()}

{'key1, key2': 1, 'key2, key3': 2}

首先,永远不要使用
dict
作为变量名,它将隐藏内置项

您可以使用任何不可变对象作为字典键,因此像
frozenset
这样的集合可能比字符串更适合您的用例:

>>> data = {'key1, key2':1, 'key2, key3':2, 'key2, key1':1}
>>> new_data = {
  frozenset(item.strip() for item in key.split(',')): val 
  for key, val in data.items()
}
>>> new_data

{frozenset({'key1', 'key2'}): 1, 
 frozenset({'key2', 'key3'}): 2}
如果确实需要将键设置为字符串:

>>> {", ".join(key): val for key, val in new_data.items()}

{'key2, key1': 1, 'key3, key2': 2}
[更新]

使用Achim建议的排序元组:

>>> new_data = {
  tuple(sorted(item.strip() for item in key.split(','))): val
  for key, val in data.items()
}
>>> new_data

{('key1', 'key2'): 1, ('key2', 'key3'): 2}

>>> {", ".join(key): val for key, val in new_data.items()}

{'key1, key2': 1, 'key2, key3': 2}

改为使用
frozenset
s键。
frozenset
s键可能是最有效的选择,正如roippi所写。排序的元组也会起作用,在某些用例中可能更方便。改为使用键
frozenset
s。
frozenset
s可能是最有效的选择,正如roippi所写。排序元组也可以工作,并且在某些用例中可能更方便。我对python真的很陌生,所以请耐心听我说。我试图在块1中应用您的代码,但收到了以下错误:AttributeError:“tuple”对象没有属性“split”?关于如何更正此错误的任何建议?不管怎样,我已使冻结集正常工作。但是,我不知道现在如何比较它们?我不知道你想要什么。字典键保证是唯一的,所以在构建字典时不需要进行任何比较。如果要测试是否存在,请使用中的
操作符(
如果密钥存在,则my_dict中的键
将为true)。我要导入的文件将使用两个键来标识一个对象。So[1,2]:a,b。但是有一些条目交换键,所以[2,1]:a,b。如果我把所有的东西都转换成冻结集,那么我的字典里应该有两个相同的冻结集[1,2]和[2,1],对吗?或者将它们转换为frozenset会消除其中一个条目吗?不,顺序对于Python
set
(我们使用
frozenset
,因为普通
set
是可变的,字典键必须是不可变的)。如果顺序对您很重要,请使用排序元组,否则可以使用冻结集。无论初始顺序如何,这两种解决方案都不会复制您的复合键。我对python非常陌生,请在这里耐心听我说。我试图在块1中应用您的代码,但收到了以下错误:AttributeError:“tuple”对象没有属性“split”?关于如何更正此错误的任何建议?不管怎样,我已使冻结集正常工作。但是,我不知道现在如何比较它们?我不知道你想要什么。字典键保证是唯一的,所以在构建字典时不需要进行任何比较。如果要测试是否存在,请使用
中的
操作符(
如果密钥存在,则my_dict中的键
将为true)。我要导入的文件将使用两个键来标识一个对象。So[1,2]:a,b。但是有一些条目交换键,所以[2,1]:a,b。如果我把所有的东西都转换成冻结集,那么我的字典里应该有两个相同的冻结集[1,2]和[2,1],对吗?或者将它们转换为frozenset会消除其中一个条目吗?不,顺序对于Python
set
(我们使用
frozenset
,因为普通
set
是可变的,字典键必须是不可变的)。如果顺序对您很重要,请使用排序元组,否则可以使用冻结集。无论原始顺序如何,这两种解决方案都不会复制复合关键点。