如何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))