我有一个元组列表,看起来像这样:
[('abc', 121),('abc', 231),('abc', 148), ('abc',221)]
我想按元组内的整数值升序对这个列表排序。这可能吗?
>>> 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
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
尝试在sorted()中使用key关键字。
sorted()
key
sorted( [('abc', 121), ('abc', 231), ('abc', 148), ('abc', 221)], key=lambda x: x[1] )
key应该是一个函数,用于标识如何从数据结构中检索可比元素。在你的例子中,它是元组的第二个元素,所以我们访问[1]。
[1]
关于优化,请参阅jamylak使用itemgetter(1)的响应,这本质上是lambda x: x[1]的更快版本。
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)]
作为一个python新手,我只是想提一下,如果数据确实是这样的:
data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]
那么sorted()将自动按元组中的第二个元素排序,因为第一个元素都相同。
在cheken的回答中, 这是如何根据降序排列中的第2项对元组列表进行排序
sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)],key=lambda x: x[1], reverse=True)
对于避免lambda的方法,首先定义自己的函数:
def MyFn(a): return a[1]
然后:
sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=MyFn)
对于Python 2.7+,这可以使接受的答案更具可读性:
Python 2.7+
sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=lambda (k, val): val)
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')]
对于就地排序,使用
foo = [(list of tuples)] foo.sort(key=lambda x:x[0]) #To sort by first element of the tuple