gpt4 book ai didi

对变量中可能存在 None 的类进行排序的 Pythonic 方式

转载 作者:行者123 更新时间:2023-12-01 01:30:51 24 4
gpt4 key购买 nike

我有一个类,看起来或多或少像这样:

class Something():
def __init__(self,a=None,b=None):
self.a = a
self.b = b

我希望能够在列表中对其进行排序,通常我只需实现这样的方法:

def __lt__(self,other):
return (self.a, self.b) < (other.a, other.b)

但是在以下情况下这会引发错误:

sort([Something(1,None),Something(1,1)])

虽然我想要的是 None 值被视为大于或以下输出:

[Something(1,1),Something(1,None)]

我首先想到的是将 __lt__ 更改为:

def __lt__(self,other):
if self.a and other.a:
if self.a != other.a:
return self.a < other.a
elif self.a is None:
return True
elif other.a is None:
return False

if self.b and other.b:
if self.b != other.b:
return self.b < other.b
elif self.b is None:
return True
return False

这会给我正确的结果,但它很丑陋,而且 python 通常有一种更简单的方法,而且我真的不想为我在整个类排序中使用的每个变量执行此操作(从这里省略以使问题更清晰)。

那么解决这个问题的Pythonic方法是什么?

注意

我也尝试过以下操作,但我假设可能会更好:

这会:

def __lt__(self,other):
sorting_attributes = ['a', 'b']
for attribute in sorting_attributes:
self_value = getattr(self,attribute)
other_value = getattr(other,attribute)
if self_value and other_value:
if self_value != other_value:
return self_value < other_value
elif self_value is None:
return True
elif self_value is None:
return False

真的想内化 Pyhton 的禅宗,我知道我的代码很丑陋,所以我该如何修复它?

最佳答案

我后来想到的一个完全不同的设计(单独发布,因为它是如此不同,所以应该独立评估):

将您的所有属性映射到 tuple s,其中每个 tuple 的第一个元素是 bool基于None - 属性的性质,第二个是属性值本身。 None/非- None不匹配会在 bool 上短路代表None -ness 防止 TypeError ,其他一切都会回退到比较好的类型:

def __lt__(self, other):
def _key(attr):
# Use attr is not None to make None less than everything, is None for greater
return (attr is None, attr)
return (_key(self.a), _key(self.b)) < (_key(other.a), _key(other.b))

可能比 my other solution 稍慢在没有None的情况下/非- None配对发生,但代码简单得多。还有持续募集的优势TypeErrorNone 以外的类型不匹配时/非- None出现,而不是潜在的不当行为。 我肯定会将此称为我的 Pythonic 解决方案,即使它在常见情况下稍微慢一些。

关于对变量中可能存在 None 的类进行排序的 Pythonic 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52884746/

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