Answers:
sorted_by_second = sorted(data, key=lambda tup: tup[1])
要么:
data.sort(key=lambda tup: tup[1]) # sorts in place
key=itemgetter(1)
并且在文件开头:from operator import itemgetter
sort
这是List
Python对象的方法,该方法接收lambda函数作为其key
参数。您可以将其命名为tup
,或t
,也可以命名为任意名称,并且仍然可以使用。tup
这里指定列表元组的索引,因此1
意味着将按照原始列表(2, 5, 8
)中元组的第二个值进行排序。
斯蒂芬的答案就是我会用的答案。为了完整起见,这是带有列表推导的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 Sorting HowTo中所述,自Python 2.4启用关键功能以来,就没有必要这样做。
为了对元组列表进行排序(<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)]
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
@Stephen的答案很关键!这是一个更好的可视化示例,
为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
是一个函数,将调用该函数来转换集合的项目以进行比较compareTo
。
传递给key的参数必须是可调用的。在这里,使用lambda
create创建一个匿名函数(可调用)。
lambda的语法是单词lambda,后跟一个可迭代的名称,然后是单个代码块。
在下面的示例中,我们正在对元组列表进行排序,该元组列表包含某些事件和演员名称的信息记录时间。
我们按照事件发生的时间对该列表进行排序-这是元组的第0个元素。
注意- s.sort([cmp[, key[, reverse]]])
将s的项目排序到位