gpt4 book ai didi

Python:处理 None 值并可在循环中使用的 Attrgetter

转载 作者:行者123 更新时间:2023-12-04 15:29:49 25 4
gpt4 key购买 nike

我有一个函数可以根据属性元组列表和反向 bool 值重复排序,如下所示:

def multisort(lst, sorting):
for attr, reverse in reversed(sorting):
lst.sort(key=operator.attrgetter(attr), reverse=reverse)
return lst

排序 var 的示例输入类似于 [('attr_1', True), ('attr_2', False)]

我正在将代码升级到 Py3,这不再有效,因为有时属性值为 None(无法将 NoneType 与非 NoneType 进行比较)。 stackoverflow 上有很多针对此类问题的解决方案,建议将 attrgetter 换成 lambda 函数,例如 lambda x: (getattr(x, attr) is None, getattr(x, attr)).

不幸的是,这对我不起作用,因为我正在排序的属性中可能有点,例如'attr_1.sub_attr_1'。 operator.attrgetter 支持这一点,但当然 native getattr 不支持。

关于我如何围绕 attrgetter 编写一个包装器来处理这个问题或编写一个可以在这里工作的自定义键函数的任何建议?提前致谢。

最佳答案

您可以使用替代的 getter,它将返回一个键函数,该函数将生成元组 (value is not None, value)(如果您希望 None 先出现, Python 2 就是这种情况,它比任何东西都少。

import operator


def none_aware_attrgetter(attr):
getter = operator.attrgetter(attr)
def key_func(item):
value = getter(item)
return (value is not None, value)
return key_func

def multisort(lst, sorting):
for attr, reverse in reversed(sorting):
lst.sort(key=none_aware_attrgetter(attr), reverse=reverse)
return lst

示例运行:

class C:
def __repr__(self):
return f'<a1:{self.a1}, a2.s: {self.a2.s}>'

a = C()
b = C()
c = C()

a.a1 = 10
b.a1 = None
c.a1 = 0


a.a2 = C()
a.a2.s = 10

b.a2 = C()
b.a2.s = None

c.a2 = C()
c.a2.s = 0


lst = [a, b, c]
print(multisort(lst, [('a1', False)]))
# [<a1:None, a2.s: None>, <a1:0, a2.s: 0>, <a1:10, a2.s: 10>]

print(multisort(lst, [('a2.s', True)]))
# [<a1:10, a2.s: 10>, <a1:0, a2.s: 0>, <a1:None, a2.s: None>]

关于Python:处理 None 值并可在循环中使用的 Attrgetter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61452346/

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