gpt4 book ai didi

python - 对 namedtuple 类进行自定义排序

转载 作者:太空狗 更新时间:2023-10-29 21:22:43 26 4
gpt4 key购买 nike

我使用 namedtuple很多课。我今天一直在想,是否有一种很好的方法可以为这样的类实现自定义排序,即使默认排序键不是 namedtuple 的第一个元素(然后是第二个、第三个等)。

我的第一直觉是实现 __lt____eq__ 并让 total_ordering做剩下的(它填写 le, 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 对我没有任何作用。

所以我想我的选择是

  1. 停止使用 namedtuple 并构建我自己的无聊类,继续使用 total_ordering
  2. 继续使用 namedtuple 并实现所有 6 种比较方法
  3. 继续使用 namedtuple 并插入一个排序值作为第一个字段。幸运的是我没有太多的类实例,但通常我只是依靠字段的顺序来初始化它们,这可能很讨厌。也许这是个坏习惯。

关于解决此问题的最佳方法的建议?

最佳答案

选项 1. 使用 mixin并将 total_ordering 应用到那个

@total_ordering
class B_ordering(object):
__slots__ = () # see Raymond's comment
def __lt__(self, other):
return self.y < other.y

class B(B_ordering, namedtuple('B', 'x y')):
pass

选项 2. 根据 total_ordering 创建您自己的装饰器,然后直接使用它

关于python - 对 namedtuple 类进行自定义排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12614213/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com