![](/img/trans.png)
[英]how to sort list of tuples in python with different size and element size
[英]How to sort nested list with different priority of characters in a single element in Python?
抱歉,无法拿出好标题。
我有一个清单:
some_list = [[X, '4x01'], [X, '3x02'], [X, '4x02'], [X, '3x01']]
其中X
是我不在乎的东西。
我想使用以下优先级对列表中的第二个元素进行排序:
最终输出应该是:
some_list = [[X, '4x01'], [X, '4x02'], [X, '3x01'], [X, '3x02']]
注意 :给出错误答案的解决方案是:
output = sorted(some_list, key=lambda lis: lis[3], reverse=True)
output = sorted(some_list, key=lambda x: (-ord(x[1][0]), x[1][-2:]))
示例运行(将X定义为None
,以便我可以复制粘贴列表定义):
>>> X = None
>>> some_list = [[X, '4x01'], [X, '3x02'], [X, '4x02'], [X, '3x01']]
>>> output = sorted(some_list, key=lambda x: (-ord(x[1][0]), x[1][-2:]))
>>> output
[[None, '4x01'], [None, '4x02'], [None, '3x01'], [None, '3x02']]
在这种情况下,您可以像@Amber一样使用复合键。 但是,这种方法并不总是有效:例如,如果两个组件都是两个字符长(因为-ord(x[1][0])
技巧将不再起作用,它将会失败)。
这是一个更通用的解决方案:
In [15]: X = None
In [16]: some_list = [[X, '4x01'], [X, '3x02'], [X, '4x02'], [X, '3x01']]
In [17]: l = sorted(some_list, key=lambda (x,y):y[-2:])
In [18]: l = sorted(l, key=lambda (x,y):y[:1], reverse=True)
In [19]: l
Out[19]: [[None, '4x01'], [None, '4x02'], [None, '3x01'], [None, '3x02']]
它一次对列表的一个条件进行排序,并利用Python的排序稳定的事实。
更为通用的方法是提供一个比较器:
def f((x1,y1), (x2,y2)):
c = cmp(y1[:1], y2[:1])
if c != 0: return -c
return cmp(y1[-2:], y2[-2:])
这可以使用如下:
In [39]: sorted(some_list, cmp=f)
Out[39]: [[None, '4x01'], [None, '4x02'], [None, '3x01'], [None, '3x02']]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.