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