- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个函数可以根据属性元组列表和反向 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/
self.data = sorted(self.data, key=attrgetter('word')) self.data 是 Word 对象的列表。 Word 对象具有“单词”、“定义”、“示例
我有一个函数可以根据属性元组列表和反向 bool 值重复排序,如下所示: def multisort(lst, sorting): for attr, reverse in reversed(so
您好,我正在尝试对字典列表进行排序并使用 attrgetter 进行排序,但它显示 attrgetter 未定义。 >>> a = ['{"count": 1, "places": [{"lat":
我正在尝试根据元素的属性在列表中选择最常见的项目。 a1 = Myclass(name='a') a2 = Myclass(name='a') b1 = Myclass(name='b') l = [
嗨,我有字典列表..我想对它进行排序,不区分大小写 members = Person.objects.filter(person=person_id) members_list = list(memb
我有一些代码要移植到 Cython,其中有一行类似 my_list.sort(key=lambda x: x.attr[item]) 有没有一种很好的Pythonic方法来避免使用itemgetter
我想获取 PosixPath 对象的列表,并根据相应的文件大小对其进行排序。我正在尝试使用排序函数来做到这一点。我要用于排序的键是 object.stat().st_size,其中 object 是一
我正在查看一些使用比较函数进行大量排序调用的代码,它似乎应该使用关键函数。 如果您要更改 seq.sort(lambda x, y: cmp(x.xxx, y.xxx)),这是更可取的: seq.so
我是一名优秀的程序员,十分优秀!