在Python中将字典用作集合项

4
有没有一种简单的方法可以使用比较函数在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)
1个回答

6
不可以。集合只能放置不可变值。这个限制不仅与比较值有关;您需要测试相等性并能够获得哈希值,最重要的是该值必须保持稳定。可变值无法满足这个要求。
通过将字典转换为一系列键值元组,可以使字典变为不可变。只要值也是不可变的,以下内容即可工作:
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'}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接