Lexicographically sort deeply nested lists of mixed data types in Python 3
在python 3中,
1 2 | >>> [0, 1] < 2 False |
实现旧的python 2行为的最佳方法是什么?
我试过对
我想能够比较两个列表,如下所示:
1 2 3 4 | >>> a = [[[0, 1], [2, 3]], [0, 1]] >>> b = [[0, 1], [2, 3]] >>> a < b False |
号
结果应该是
我希望实现一个与内置的python 3
因为,正如python 2文档中提到的那样:
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.
号
只有当两个对象属于同一类型时,对象比较才有意义。依赖于表达式(如
为了进一步解释,如果您有清单
所以,这个排序被破坏了。
如上所述,如果您有一些列表可以有意义地排序,而有些列表不能排序(因为上面的解释),那么一个简单的解决方案是捕获可能的异常,然后返回false。
1 2 3 4 | try: [0, 1] < 2 except TypeError: # return or assign False. True is not actually meaningful. |
号
或者,对于list.sort()。
1 2 3 4 | try: x.sort() except TypeError: pass # Do nothing. Python would produce meaningless results, anyway. |
如果您想要产生一个有意义的排序(如果这确实有意义),那么您必须定义一个键函数,正如前面提到的那样。不过,这可能相当复杂。也许从不同的角度来看待你的问题会更好。
这条路很慢。
要在不可比较类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | a = [[[0, 1], [2, 3]], [0, 1]] b = [[0, 1], [2, 3]] def deep_annotate(item): if isinstance(item, list): return (1, [deep_annotate(i) for i in item]) else: return (0, item) deep_annotate(a) < deep_annotate(b) #>>> False deep_annotate(a) > deep_annotate(b) #>>> True |
。
不幸的是,这并不是捷径,可以通过巧妙地使用
正确的解决方案不是子类
1 | sorted(l, key=custom_key_function) |
在不知道您的列表可能包含哪些类型的元素的情况下,我不会推测如何实现它的进一步细节,但我认为从您的示例中可以公平地说,您可能需要使用相同的