4

有没有办法通过使用简单的方法(如比较器函数)将一些 dict 对象放入 Python 中的集合中?

在这里遇到了一些解决方案,这些解决方案涉及一堆看起来非常复杂且容易出错的东西(似乎是在未定义的顺序中迭代 dict 的问题,等等......)。做这样的事情会很好,这在技术上在数学上是无效的,因为两个对象可以有不同的信息,但被评估为相等,但适用于大量现实生活用例:

# 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)
4

1 回答 1

6

你不能。您只能将不可变值放入集合中。此限制不仅仅与能够比较值有关;您需要测试两者是否相等并能够获得哈希值,并且最重要的是该值必须保持稳定。可变值无法满足最后一个要求。

字典可以通过将其转换为一系列键值元组来使其不可变;如果这些值也是不可变的,则以下工作:

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

这使得通过tuple(sorted(somedict.items())) in widget_set至少测试来测试相同字典的存在成为可能。将值转回 adict是一个调用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'}
于 2013-05-13T21:26:23.027 回答