2013-05-13 26 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'}