2013-05-13 27 views
4

有没有办法通过使用简单的方法将一些dict对象放入Python的集合中,比如比较函数?使用词典作为Python中的集合中的项目

在这里遇到了一些解决方案,涉及一堆看起来非常复杂和容易出错的东西(似乎是在未定义的订单中迭代字典等问题)。会是不错的做这样的事情这在技术上是不是数学上无效的,因为两个对象可以有不同的信息,但被评价为平等的,但对于很多现实生活中的用例的伟大工程:

# One of the dicts: 
widget = { 
    lunch: 'eggs', 
    dunner: 'steak' 
} 

# Define a comparator function (ignores dinner) 
def comparator(widget1, widget2): 
    return widget1['lunch'] > widget2['lunch'] 

widget_set = set([widget], comparator) 

回答

5

不,你不能。你只能将不可变的值放入一个集合中。这个限制不仅仅是能够比较值,您需要测试两者是否相等,并且能够获得散列值,并且大部分值都具有以保持稳定。可变的值不符合最后的要求。

通过将字典变成一系列键值元组,可以使字典不可变;所提供的值是不可变的太,以下工作:

widget_set = {tuple(sorted(widget.items()))} # {..} is a set literal, Python 2.7 and newer 

这使得有可能通过测试tuple(sorted(somedict.items())) in widget_set至少测试对于相同的字典的存在。谈到值回一个dict是它调用dict的问题:

dict(widget_set.pop()) 

演示:

>>> widget = { 
...  'lunch': 'eggs', 
...  'dunner': 'steak' 
... } 
>>> widget_set = {tuple(sorted(widget.items()))} 
>>> tuple(sorted(widget.items())) in widget_set 
True 
>>> dict(widget_set.pop()) 
{'lunch': 'eggs', 'dunner': 'steak'}