加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

按字典顺序在Python 3中对嵌套的混合数据类型列表进行排序

发布时间:2020-12-20 13:43:14 所属栏目:Python 来源:网络整理
导读:在 Python 3中,list.sort()方法将执行字典排序.但是在Python 3中,将列表与float或int进行比较会引发TypeError,与Python 2不同,您可以在其中执行此操作: [0,1] 2False 实现旧的Python 2行为的最佳方法是什么? 我已经尝试了子类化列表,但为了实现这一点,必须
在 Python 3中,list.sort()方法将执行字典排序.但是在Python 3中,将列表与float或int进行比较会引发TypeError,与Python 2不同,您可以在其中执行此操作:

>>> [0,1] < 2
False

实现旧的Python 2行为的最佳方法是什么?

我已经尝试了子类化列表,但为了实现这一点,必须将每个嵌套列表强制转换为子类类型,以便所有嵌套比较都使用重写的比较方法.有没有办法实现这一点,而不是诉诸于递归地将每个嵌套列表转换为子类?

我希望能够像这样比较两个列表:

>>> a = [[[0,1],[2,3]],[0,1]]
>>> b = [[0,3]]
>>> a < b
False

结果应为False,因为[0] [0]是一个列表而b [0] [0]是一个int,在我的情况下,int应始终被认为小于列表.

编辑:

我正在寻找实现一个与内置的Python 3 list.sort相同的排序函数,除非将列表与float或int进行比较,在这种情况下,列表应始终被视为更大.

解决方法

自 as mentioned in the Python 2 docs:

Most other objects of built-in types compare unequal unless they are
the same object; the choice whether one object is considered smaller
or larger than another one is made arbitrarily but consistently within
one execution of a program.

对象比较仅在两个对象属于同一类型时才有意义.依赖于[0,1]等表达式返回的值. 2不应该在程序中完成,这就是为什么从Python 3中删除了这种行为的原因.

为了进一步解释,如果你有列表[[[0,1]],这有两个要素:
[[0,3]]和[0,1].为了让python对它们进行排序,它按字典顺序比较它们的内部值,因为它们都是列表,第一个值为[0,1]和[2,3],第二个值为0和1.但是,它必须将[0,1]与0进行比较,它们的类型不同,因此,比较产生任意结果.

所以,这种分类是破碎的.

如上所述,如果你有一些可以有意义地排序的列表和一些不能排序的列表(由于上面的解释),一个简单的解决方案是捕获可能的异常然后返回False.

try:
    [0,1] < 2
except TypeError:
    # return or assign False. True is not actually meaningful.

或者,对于list.sort()

try:
    x.sort()
except TypeError:
    pass    # Do nothing. Python would produce meaningless results,anyway.

如果你想产生一个有意义的排序(如果这实际上有意义),那么你必须定义一个关键函数,如前所述.但这可能相当复杂.也许从不同的角度看待你的问题会更好.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读