我使用namedtuple类很多。我一直在想,如果有一种很好的方法来为这样的类实现自定义排序,即使默认排序键不是第一个元素(然后是第二个,第三个等)的namedtuple。在namedtuple类上自定义排序
我的第一反应是实现__lt__
和__eq__
让total_ordering
做休息(它填补了乐,NE,GT,GE):
from collections import namedtuple
from functools import total_ordering
@total_ordering
class B(namedtuple('B', 'x y')):
def __lt__(self, other):
return self.y < other.y
但是:
def test_sortingB():
b1 = B(1, 2)
b2 = B(2, 1)
assert b2 < b1 # passes
assert b2 <= b1 # fails
哦,正确... total_ordering
只填写了其他方法if they are missing。由于tuple/namedtuple有这样的方法,total_ordering对我来说没有任何帮助。
所以我想我的选择是
- 停止使用namedtuple,只是建立自己的无聊的课,继续使用total_ordering使用namedtuple
- 保管和使用namedtuple和插入实现所有6种比较方法
- 保持作为第一个字段的排序值。幸运的是,我没有太多类的实例,但通常我只是依靠字段的顺序来初始化它们,这可能是讨厌的。也许这是一个坏习惯。
有关解决此问题的最佳方法的建议?
为什么不只是按照您想排序的顺序创建namedtuple字段? – BrenBarn
我没有意识到我想排序/最大等,直到我已经创建并使用它一段时间。所以我现在可以添加一个领先的领域作为排序领域,但它可能有点破坏性。 – pfctdayelise
但是你如何使用namedtuple?关于namedtuple的好处是它可以让你按名称访问项目,所以你可以改变你的namedtuple,让字段按照正确的顺序,而不会影响你的代码,只要你按名称访问字段(这可能是你在做什么,或者为什么使用namedtuple?)。 – BrenBarn