繁体   English   中英

给定元组列表如何按第二个元素排序(假设第一个元素已对它进行排序)

[英]How to order a list of tuples by second element given that it is already ordered by first element

所以我有一个这样的清单:

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)]

也就是说,元组被排序,使得第一元素按降序排列,而在第一元素相同的情况下,元组与第二元素被按升序排序。

您可以按第一个元素分组,然后对每个组的元素进行排序:

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)]

排序时,可以定义进行比较之前要调用的函数。 在您的情况下应该起作用的一种可能方法是定义一个如下函数:

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)]

尝试这个:

print sorted(list_, key=lambda x:(-x[0],x[1]))

输出:

[(3, 2), (2, 1), (2, 2), (1, 1), (1, 2), (1, 3)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM