所以我有一个这样的列表:
list_ = [(3, 2), (2, 2), (2, 1), (1, 3), (1, 2), (1, 1)]
我想对它进行排序,以便第一个元素保持相同的顺序,即3,2,2,1,1,1,但第二个元素的排序顺序相反,所以它就像这样:
list_ = [(3, 2), (2, 1), (2, 2), (1, 1), (1, 2), (1, 3)]
我似乎无法想出一种简单的方法。 (我对编程很陌生。
编辑:另一个例子是订购此列表:
[(2,3), (3,2), (1,3), (3,4), (5,1)]
这样就变成了这个:
[(5,1), (3,2), (3,4), (2,3), (1,3)]
即。对元组进行排序,使得第一个元素按递减顺序排列,第一个元素相同,元组按第二个元素的顺序排列。
答案 0 :(得分:1)
您可以按第一个元素分组,然后对每个组的元素进行排序:
from itertools import groupby
l = [(3, 2), (2, 2), (2, 1), (1, 3), (1, 2), (1, 1)]
l = [
v for first, items in groupby(l, key=lambda x: x[0])
for v in sorted(items, key=lambda x: x[1])
]
结果:
[(3, 2), (2, 1), (2, 2), (1, 1), (1, 2), (1, 3)]
如果第一个元素必须按降序排序,那么您可以先按第二个元素排序,然后按稳定排序第一个元素。
>>> l.sort(key=lambda x: x[1])
>>> l.sort(key=lambda x: x[0], reverse=True)
>>> l
[(3, 2), (2, 1), (2, 2), (1, 1), (1, 2), (1, 3)]
答案 1 :(得分:0)
排序时,您可以在进行比较之前定义要调用的函数。在你的情况下应该适用的一种可能的方法是定义一个这样的函数:
def get_key(item):
return (-item[0], item[1])
这是有效的,因为在Python中,可以通过比较适当位置的值来比较元组。这个关键函数使排序算法首先选择第一个元素具有最大值的对,然后通过首先选择具有较小值的元素来确定所有关系。
然后,您可以通过调用sorted并将参数key
设置为先前描述的函数来对列表进行排序。
>>> list_[(3, 2), (2, 2), (2, 1), (1, 3), (1, 2), (1, 1)]
>>>> sorted(list_, key=get_key)
[(3, 2), (2, 1), (2, 2), (1, 1), (1, 2), (1, 3)]
答案 2 :(得分:0)
试试这个:
print sorted(list_, key=lambda x:(-x[0],x[1]))
输出:
[(3, 2), (2, 1), (2, 2), (1, 1), (1, 2), (1, 3)]