使用python对列表进行排序

使用python对列表进行排序,python,sorting,Python,Sorting,我有一张单子 value =[(22, 11, 195, 37), (19, 11, 184, 45), (300, 17, 12, 19), (210, 18, 128, 30) (100, 18, 128, 30)] 现在我需要结合升序列表中的前两个值对列表进行排序 像这样 s = [(19, 11, 184, 45), (22, 11, 195, 37), (300, 17, 12, 19),(100, 18, 128, 30), (210, 18, 128, 30) ] 我曾经 s

我有一张单子

value =[(22, 11, 195, 37), (19, 11, 184, 45), (300, 17, 12, 19), (210, 18, 128, 30) (100, 18, 128, 30)]
现在我需要结合升序列表中的前两个值对列表进行排序

像这样

s = [(19, 11, 184, 45), (22, 11, 195, 37), (300, 17, 12, 19),(100, 18, 128, 30), (210, 18, 128, 30) ]
我曾经

s = sorted(value, key = lambda x: (x[1], x[0]))
最后我对列表的第二个(x[1])值进行排序,如下所示

s = [(22, 11, 195, 37), (19, 11, 184, 45), (300, 17, 12, 19), (210, 18, 128, 30) (100, 18, 128, 30)]

有什么办法吗?我也尝试过运算符库,它给出了相同的结果。

正如您所理解的,
sorted
函数(以及
list.sort
方法)使用一个键作为可选参数,它告诉我们如何对元素进行排序

您使用
lambda x:(x[0],x[1])
作为键,但您的输出清楚地表明您希望第二个成员比第一个成员具有更高的优先级。 请尝试使用此键:

l = sorted(l, key=lambda t: (t[1], t[0]))
这将赋予每个元组的第二个成员更高的重要性

正如预期的那样,输出为:

[(0, 0, 559, 225),
(19, 11, 184, 45),
(22, 11, 195, 37),
(300, 17, 12, 19),
(210, 18, 128, 30)]

好吧,在做了很多小提琴之后,我想我做到了。这是我的密码:

sorted(s, key=lambda x: (x[1] * 1, x[0]))
输出为:

[(19, 11, 184, 45), (22, 11, 195, 37), (300, 17, 12, 19), (100, 18, 128, 30), (210, 18, 128, 30)]

基本上,这是按照索引1对元组进行排序,但是如果两个或更多元组在索引1上有相同的编号,它会检查它们的索引0编号并按升序进行排序。

旁注:在这里可以进行更多的自文档化(并且增加一个标题的速度),例如
key=itemgetter(1,0)
@ShadowRanger这很聪明。我不知道
itemgetter
。我使用了相同的s=sorted(calculation,key=lambda x:(x[1],x[0]),但仍然没有对原始列表进行排序。我在下面评论了[(0,0,559,225),(344,11,195,37),(19,11,184,45),(209,18,128,30),(517,20,12,19),(492,20,16,5),(354,20,9,4),(476,21,7,15),(435,21,21,17),(30,21,15,17),(305,28,8,10),(242,28,2,1),(128,28,7,10),(83,28,13,10),(61,28,12,10),(354,32),(492, 33, 16, 6), (285, 37, 1, 1), (242, 37, 3, 1), (221, 37, 1, 1), (152, 37, 2, 1), (291, 64, 138, 46), (132, 65, 154, 37), (142, 74, 10, 5), (403, 81, 3, 11), (379, 82, 15, 10), (360, 82, 2, 1)]这是我生活的一部分list@DeepanRaj我认为问题在于你的标准没有得到很好的定义。你问的问题很不清楚,但我提供的解决方案确实适用于你给出的样本列表。你能尝试更准确地定义你期望的行为吗?事实上,这个列表很大,所以我自己列了一个列表,下面是f完整列表[(0,0,559,225),(344,11,195,37),(19,11,184,45),(209,18,128,30),(517,20,12,19),(492,20,16,5),(354,20,9,4),(476,21,7,15),(435,21,21,17),(30,21,15,17),(305,28,8,10),(242,28,2,1),(128,28,7,10),(83,28,13,10),(61,28,12,10),(354,32,11,33,6),(285, 37, 1, 1), (242, 37, 3, 1), (221, 37, 1, 1), (152, 37, 2, 1), (291, 64, 138, 46), (132, 65, 154, 37), (142, 74, 10, 5), (403, 81, 3, 11), (379, 82, 15, 10), (360, 82, 2, 1)]甚至这也是列表的一部分。我想对列表中的前两个值进行排序list@DeepanRaj是的,但是你希望它如何排序?你说的前两个值是什么意思。问题不清楚……列表中的前两个值是[(0,0559225)]在这个例子中,前两个值0和0,基于这两个值的升序组合,我需要对列表进行排序。您的问题与您提供的示例相矛盾。
排序(value,key=lambda x:(x[1],x[0])
返回所需的结果,而不是以
开头的列表(22,11,195,37)
。可能存在重复的