按第二项(整数值)对元组列表进行排序

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

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

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

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

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

key应该是一个函数,用于标识如何从数据结构中检索可比较的元素。 在你的情况下,它是元组的第二个元素,所以我们访问[1]

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

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

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

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

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

添加到Cheeken的答案,这是你如何排序第二项按降序排列的元组列表。

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

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

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

 def MyFn(a): return a[1] 

然后:

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

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

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

对于原地排序,请使用

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

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