Sort a list of tuples by 2nd item (integer value)
本问题已经有最佳答案,请猛点这里访问。
我有一个类似这样的元组列表:
1 | [('abc', 121),('abc', 231),('abc', 148), ('abc',221)] |
我想按元组中的整数值以升序对这个列表进行排序。有可能吗?
尝试在
1 | sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=lambda x: x[1]) |
有关优化,请参见Jamyak使用
1 2 3 4 | >>> 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)] |
在这种情况下,使用
1 2 3 4 5 | >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新手,我只想说,如果数据真的像这样:
1 | data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)] |
然后,
加上契肯的回答,这是如何按第二项降序排列元组列表。
1 | sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)],key=lambda x: x[1], reverse=True) |
。
从python wiki:
1 2 3 4 5 | >>> 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)] |
。
对于就地排序,请使用
1 2 | foo = [(list of tuples)] foo.sort(key=lambda x:x[0]) #To sort by first element of the tuple |
。
对于lambda避免方法,首先定义自己的函数:
1 2 | def MyFn(a): return a[1] |
。
然后:
1 | sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=MyFn) |
对于
1 | sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=lambda (k, val): val) |
。
操作中的排序值是整数这一事实本身与问题无关。换句话说,如果排序值是文本,则接受的答案将起作用。我提出这一点,也指出排序过程中可以修改排序(例如,考虑大小写)。
1 2 3 4 | >>> 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')] |