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

Amy*_*yth 370 python tuples list

我有一个类似于下面的元组列表:

[('abc', 121),('abc', 231),('abc', 148), ('abc',221)]
Run Code Online (Sandbox Code Playgroud)

我想按元组内的整数值按升序对此列表进行排序.可能吗?

che*_*ken 575

尝试使用key关键字sorted().

sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=lambda x: x[1])
Run Code Online (Sandbox Code Playgroud)

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

有关优化,请参阅jamylak的响应itemgetter(1),这实际上是一个更快的版本lambda x: x[1].

  • ,reverse =从最大到最小的真. (11认同)
  • 虽然很明显.排序不会排序到位:sorted_list = sorted([('abc',121),('abc',231),('abc',148),('abc',221)],key = lambda x :x [1]) (9认同)
  • 我只是想说这是我有史以来访问量最大的 stackoverflow 页面;到目前为止,我已经来过这里 500 次了。谢谢你,厚脸皮,如果我能记住这一行代码就好了。 (4认同)
  • 这仍适用于Python 3.7. (3认同)
  • 您还可以添加多个键作为元组,如果您想要一个相反的键,您可以添加一个负号,这将首先使用第一个元素然后使用第二个元素进行排序:`sorted(some_list, lambda x: (x[0], -x[1],))` (3认同)

jam*_*lak 190

>>> 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)]
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • +1我同意`itemgetter()`是一个更好的解决方案.但是,我认为lambda表达式会更清楚`key`的功能. (12认同)
  • @JeffSheffield:请注意,jamyak 是在设置代码(时间之外)中进行导入,而不是在测试代码中进行导入。这是完全合理的,因为大多数程序需要多次排序,或者需要对更大的集合进行排序,但它们只会执行一次导入。(对于那些只需要做一个小程序的程序......好吧,你说的是不到一微秒的差异,所以谁在乎呢?) (2认同)

Vig*_*vel 41

添加到Cheeken的答案,这是按第二项降序排序元组列表的方法.

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


小智 40

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

data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]
Run Code Online (Sandbox Code Playgroud)

然后sorted()会自动按元组中的第二个元素排序,因为第一个元素都是相同的.


Dmi*_*kin 15

来自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)]
Run Code Online (Sandbox Code Playgroud)


小智 13

对于就地排序,请使用

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

  • 实际上这有助于人们寻找就地排序 (4认同)
  • 虽然这个答案可能是正确的,但最好解释为什么这个答案是正确的,而不是只提供代码。此外,这几乎是 5 年前已经存在并被接受的答案的准确答案,因此这并没有真正向网站添加任何内容。看看更新的问题来帮助人们! (2认同)

小智 7

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

def MyFn(a):
    return a[1]
Run Code Online (Sandbox Code Playgroud)

然后:

sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=MyFn)
Run Code Online (Sandbox Code Playgroud)

  • 一个好处是拥有一个可以在任何地方使用的定义函数,而无需在多个代码区域中放置`lambda x:x [1]`. (5认同)
  • 这有什么好处? (2认同)
  • 另一个好处是,如果它是单独的功能,则可以更好地记录/注释。 (2认同)

Nei*_*eil 5

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

sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=lambda (k, val): val)
Run Code Online (Sandbox Code Playgroud)