502

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

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

我想按元组内的整数值升序对该列表进行排序。是否可以?

4

9 回答 9

762

尝试使用key关键字 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]

于 2012-05-22T02:51:36.023 回答
225
>>> 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)]

在这种情况下, IMO usingitemgetter比@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
于 2012-05-22T02:51:24.010 回答
50

添加到 Cheeken 的答案中,这就是您如何按第二项按降序对元组列表进行排序

sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)],key=lambda x: x[1], reverse=True)
于 2015-03-29T17:50:13.270 回答
44

作为一个 python 新手,我只想提一下,如果数据确实看起来像这样:

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

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

于 2013-11-20T22:49:59.440 回答
28

对于就地排序,请使用

foo = [(list of tuples)]
foo.sort(key=lambda x:x[0]) #To sort by first element of the tuple
于 2017-06-30T18:13:23.223 回答
15

来自 python 维基:

>>> 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)]
于 2012-05-22T02:54:10.873 回答
8

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

def MyFn(a):
    return a[1]

然后:

sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=MyFn)
于 2016-02-16T02:58:13.143 回答
4

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

sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=lambda (k, val): val)
于 2017-02-05T11:01:05.483 回答
0

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')]
于 2017-06-01T15:15:15.507 回答