关于python:按第二项排序元组列表(整数值)

Sort a list of tuples by 2nd item (integer value)

本问题已经有最佳答案,请猛点这里访问。

我有一个类似这样的元组列表:

1
[('abc', 121),('abc', 231),('abc', 148), ('abc',221)]

我想按元组中的整数值以升序对这个列表进行排序。有可能吗?


尝试在sorted()中使用key关键字。

1
sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=lambda x: x[1])

key应该是一个函数,用于标识如何从数据结构中检索可比较元素。在您的例子中,它是tuple的第二个元素,因此我们访问[1]

有关优化,请参见Jamyak使用itemgetter(1)的响应,它本质上是lambda x: x[1]的更快版本。


1
2
3
4
>>> from operator import itemgetter
>>> data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]
>>> sorted(data,key=itemgetter(1))
[('abc', 121), ('abc', 148), ('abc', 221), ('abc', 231)]

在这种情况下,使用itemgetter的IMO比@cheeken的解决方案更易于阅读。它是也更快,因为几乎所有的计算都将在c侧进行(不打算使用双关语),而不是通过使用lambda

1
2
3
4
5
>python -m timeit -s"from operator import itemgetter; data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]""sorted(data,key=itemgetter(1))"
1000000 loops, best of 3: 1.22 usec per loop

>python -m timeit -s"data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]""sorted(data,key=lambda x: x[1])"
1000000 loops, best of 3: 1.4 usec per loop


作为一名python新手,我只想说,如果数据真的像这样:

1
data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]

然后,sorted()将自动按元组中的第二个元素排序,因为第一个元素都是相同的。


加上契肯的回答,这是如何按第二项降序排列元组列表。

1
sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)],key=lambda x: x[1], reverse=True)


从python wiki:

1
2
3
4
5
>>> from operator import itemgetter, attrgetter    
>>> sorted(student_tuples, key=itemgetter(2))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]    
>>> sorted(student_objects, key=attrgetter('age'))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]


对于就地排序,请使用

1
2
foo = [(list of tuples)]
foo.sort(key=lambda x:x[0]) #To sort by first element of the tuple


对于lambda避免方法,首先定义自己的函数:

1
2
def MyFn(a):
    return a[1]

然后:

1
sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=MyFn)


对于Python 2.7+而言,这项工作使可接受的答案更易读:

1
sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=lambda (k, val): val)


操作中的排序值是整数这一事实本身与问题无关。换句话说,如果排序值是文本,则接受的答案将起作用。我提出这一点,也指出排序过程中可以修改排序(例如,考虑大小写)。

1
2
3
4
>>> sorted([(121, 'abc'), (231, 'def'), (148, 'ABC'), (221, 'DEF')], key=lambda x: x[1])
[(148, 'ABC'), (221, 'DEF'), (121, 'abc'), (231, 'def')]
>>> sorted([(121, 'abc'), (231, 'def'), (148, 'ABC'), (221, 'DEF')], key=lambda x: str.lower(x[1]))
[(121, 'abc'), (148, 'ABC'), (231, 'def'), (221, 'DEF')]