当前位置: 首页 > 面试题库 >

按可以为无的属性排序列表

杜霍英
2023-03-14
问题内容

我正在尝试使用排序对象列表

my_list.sort(key=operator.attrgetter(attr_name))

但是,如果任何列表项包含attr = None而不是attr = 'whatever'

然后我得到一个 TypeError: unorderable types: NoneType() < str()

在Py2中,这不是问题。如何在Py3中处理此问题?


问题答案:

排序比较运算符约在Python
3种严格,如描述在这里:

当操作数没有有意义的自然顺序时,顺序比较运算符(<,<=,> =,>)会引发TypeError异常。

Python 2None在任何字符串(甚至是空字符串)之前进行排序:

>>> None < None
False

>>> None < "abc"
True

>>> None < ""
True

在Python 3中,任何对NoneType实例进行排序的尝试都会导致异常:

>>> None < "abc"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: NoneType() < str()

我能想到的最快的解决方法是将None实例显式映射为可排序的对象,例如""

my_list_sortable = [(x or "") for x in my_list]

如果您想对数据进行排序同时保持其完整性,则只需提供sort一个自定义key方法即可:

def nonesorter(a):
    if not a:
        return ""
    return a

my_list.sort(key=nonesorter)


 类似资料:
  • 问题内容: 我正在尝试按属性对一些数据进行排序。这是我tought应该可以工作的示例,但事实并非如此。 HTML部分: JS部分: 结果: A-> AData B-> BData C-> C数据 …恕我直言,应如下所示: C-> C数据 B-> BData A-> AData 我是否错过了某些东西(可以在这里进行JSFiddle的实验)? 问题答案: AngularJS的orderBy过滤器仅支持

  • 问题内容: 我想按对象的指定属性对对象列表进行排序,并希望选择用于排序的属性。例: 这个想法很简单: 我将要排序的所有值都放入一个数组中,并创建了一个映射,将这些值映射回它们的对象。对这个数组进行排序后,我将映射到这些值的对象按相同的顺序放入一个新数组中,然后按这些值对它们进行排序。这些值只是使用Object类型创建的,因此我可以按多种类型(不仅仅是示例中的Strings)进行排序。 除非您有两个

  • 问题内容: 我有一个清单清单: 如果要按一个元素(例如,高/短元素)排序,可以通过进行。 如果我想作为排序依据两个高大和颜色,我可以为每个元素做排序两次,一次,但有一个更快的方法? 问题答案: 键可以是返回元组的函数: 或者,你可以使用来实现相同的效果(速度更快,并且避免了Python函数调用): 并请注意,你可以在此处使用而不是使用,然后重新分配:

  • 问题内容: 我现在只需获取数组的前3个对象并映射它们: 每个都有一个属性(champ.level)。 如何将输出分类到 前三个切片中? 问题答案: 与自定义比较功能一起使用时,首先要进行降序排序: 使用ES6甚至更好:

  • 哦,那些狡猾的Java8条带有lambdas的溪流。它们非常强大,但是复杂的东西需要一点时间来包裹它。 假设我有一个类型,其属性为。假设我有这些用户的地图 ?