如何按给定索引处的元素对列表/元组的列表/元组进行排序?

我在列表列表或元组列表中有一些数据,如下所示:

data = [[1,2,3], [4,5,6], [7,8,9]]data = [(1,2,3), (4,5,6), (7,8,9)]

我想按子集中的第二个元素排序。意思是,按2,5,8排序,其中2来自(1,2,3)5来自(4,5,6)。常见的方法是什么?我应该在列表中存储元组还是列表?

888697 次浏览
sorted_by_second = sorted(data, key=lambda tup: tup[1])

或:

data.sort(key=lambda tup: tup[1])  # sorts in place

默认排序模式是升序。要按降序排序,请使用选项reverse=True

sorted_by_second = sorted(data, key=lambda tup: tup[1], reverse=True)

或:

data.sort(key=lambda tup: tup[1], reverse=True)  # sorts in place

斯蒂芬的回答是我使用的那个。为了完整性,这是带有列表理解的DSU(装饰-排序-取消装饰)模式:

decorated = [(tup[1], tup) for tup in data]decorated.sort()undecorated = [tup for second, tup in decorated]

或者,更简洁地说:

[b for a,b in sorted((tup[1], tup) for tup in data)]

Python排序如何所述,自Python 2.4以来,当关键函数可用时,这是不必要的。

from operator import itemgetterdata.sort(key=itemgetter(1))

对元组进行排序非常简单:

tuple(sorted(t))

如果你想对数组从高到低进行排序,我只想添加到Stephen的答案中,除了上面的评论之外,另一种方法就是将其添加到行中:

reverse = True

结果如下:

data.sort(key=lambda tup: tup[1], reverse=True)

对于按多个条件排序,例如按元组中的第二个和第三个元素排序,让

data = [(1,2,3),(1,2,1),(1,1,4)]

因此定义一个lambda,它返回一个描述优先级的元组,例如

sorted(data, key=lambda tup: (tup[1],tup[2]) )[(1, 1, 4), (1, 2, 1), (1, 2, 3)]

没有lambda:

def sec_elem(s):return s[1]
sorted(data, key=sec_elem)

itemgetter()lambda tup: tup[1]略快,但增幅相对较小(约10%至25%)。

(IPython会话)

>>> from operator import itemgetter>>> from numpy.random import randint>>> values = randint(0, 9, 30000).reshape((10000,3))>>> tpls = [tuple(values[i,:]) for i in range(len(values))]
>>> tpls[:5]    # display sample from list[(1, 0, 0),(8, 5, 5),(5, 4, 0),(5, 7, 7),(4, 2, 1)]
>>> sorted(tpls[:5], key=itemgetter(1))    # example sort[(1, 0, 0),(4, 2, 1),(5, 4, 0),(8, 5, 5),(5, 7, 7)]
>>> %timeit sorted(tpls, key=itemgetter(1))100 loops, best of 3: 4.89 ms per loop
>>> %timeit sorted(tpls, key=lambda tup: tup[1])100 loops, best of 3: 6.39 ms per loop
>>> %timeit sorted(tpls, key=(itemgetter(1,0)))100 loops, best of 3: 16.1 ms per loop
>>> %timeit sorted(tpls, key=lambda tup: (tup[1], tup[0]))100 loops, best of 3: 17.1 ms per loop

为了对元组列表(<word>, <count>)进行排序,count按降序排列,word按字母顺序排列:

data = [('betty', 1),('bought', 1),('a', 1),('bit', 1),('of', 1),('butter', 2),('but', 1),('the', 1),('was', 1),('bitter', 1)]

我使用这种方法:

sorted(data, key=lambda tup:(-tup[1], tup[0]))

它给我的结果是:

[('butter', 2),('a', 1),('betty', 1),('bit', 1),('bitter', 1),('bought', 1),('but', 1),('of', 1),('the', 1),('was', 1)]

@Stephen的回答很中肯!这是一个更好的可视化示例,

为《头号玩家》的粉丝们欢呼吧!=)

>>> gunters = [('2044-04-05', 'parzival'), ('2044-04-07', 'aech'), ('2044-04-06', 'art3mis')]>>> gunters.sort(key=lambda tup: tup[0])>>> print gunters[('2044-04-05', 'parzival'), ('2044-04-06', 'art3mis'), ('2044-04-07', 'aech')]

key是一个函数,将被调用来转换集合的项目以进行比较…就像Java中的compareTo方法一样。

传递给key的参数必须是可调用的。在这里,lambda的使用创建了一个匿名函数(它是可调用的)。
lambda的语法是单词lambda后跟一个可迭代的名称,然后是一个代码块。

下面的示例,我们正在排序一个元组列表,该列表包含某些事件和演员名称的时间信息。

我们根据事件发生的时间对这个列表进行排序-这是元组的第0个元素。

注意-s.sort([cmp[, key[, reverse]]])对s的项目进行排序

我在我的代码中使用它:

#To sort the list based on each element's second integer (elem[1])sorted(d2, key=lambda elem: elem[1])

根据您要对其进行排序的元素,您可以将其放入

(elem[*insert the index of the element you are sorting it by*])