在Python中使用dicts作为集合中的项

2024-06-15 05:00:15 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中,有没有一种方法可以通过使用一个简单的方法(比如comparator函数)将dict对象放入一个集合中?

在这里遇到了一些解决方案,它们涉及到一堆看起来非常复杂和容易出错的东西(似乎是以未定义的顺序迭代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)

Tags: 对象方法函数顺序数学解决方案widgetdict
1条回答
网友
1楼 · 发布于 2024-06-15 05:00:15

不,你不能。只能将不可变的值放入集合中。这个限制不仅仅是比较值,还需要测试两个值是否相等,并能够获得一个散列值,最重要的是的值保持稳定。可变值不能满足最后的要求。在

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

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

这使得至少通过测试tuple(sorted(somedict.items())) in widget_set来测试是否存在相同的字典。将值返回到dict是调用dict的问题:

^{pr2}$

演示:

>>> 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'}

相关问题 更多 >