![](/img/trans.png)
[英]Given a list of tuples, if the first element is the same, how do i add the second element inside each similar tuple
[英]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.