如何sorting(列表/元组)列表/元组?

我有一些数据在列表中包含列表,或列表包含元组。

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

我想按照子集中的第二个元素sorting。 意思是按2,5,8sorting,其中2是从(1,2,3),5是从(4,5,6)。 什么是常见的方法来做到这一点? 我应该在我的列表中存储元组还是列表? 由于元组更不灵活。

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

要么:

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

我只是想添加斯蒂芬的答案,如果你想sorting数组从高到低,除了在上面的意见之外的另一种方式只是将其添加到行:

 reverse = True 

结果如下:

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

斯蒂芬的答案是我会用的。 为了完整起见,这里是DSU(装饰sortingundecorate)模式与列表parsing:

 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)] 

正如在“ Pythonsorting方法”中提到的那样,从Python 2.4开始,当关键函数变为可用时,这已经是不必要的了。

按照多个标准进行sorting,例如通过元组中的第二个和第三个元素进行sorting

 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):
    返回s [2] 

然后用第二个参数对键进行sorting:

  sort(data,key = sec_elem) 

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

 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)] 

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 

@斯蒂芬的答案是关键的! 这是一个更好的可视化的例子,

大声喊出Ready Player One粉丝! =)

 >>> 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方法。

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

下面的例子中,我们正在sorting一个包含特定事件和演员姓名的信息abt时间的元组列表。

我们按事件发生的时间对这个列表进行sorting – 这是一个元组的第0个元素。

注 – s.sort([cmp[, key[, reverse]]])对s的项目进行sorting

对元组sorting很简单:

 tuple(sorted(t))