我有一个元组列表,看起来像这样:

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

我想按元组内的整数值升序对这个列表排序。这可能吗?


当前回答

对于Python 2.7+,这可以使接受的答案更具可读性:

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

其他回答

>>> 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。

>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

尝试使用keyword with sorted()。

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

Key应该是一个函数,它确定如何从数据结构中检索可比较的元素。在你的例子中,它是元组的第二个元素,所以我们访问[1]。

关于优化,请参阅jamylak使用itemgetter(1)的响应,这本质上是lambda x: x[1]的更快版本。

来自python wiki:

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

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

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

在奇肯的回答中, 这就是按第二项降序排序元组列表的方法。

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