我在列表或元组列表中有一些数据,如下所示:
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)。通常的方法是什么?我应该在列表中存储元组或列表吗?
关于"我应该在列表中存储元组或列表吗?"经验法则是使事物尽可能不可变。如果您不需要在适当的位置修改子列表,那么就让它们成为元组。
sorted_by_second = sorted(data, key=lambda tup: tup[1])
或: </P >
data.sort(key=lambda tup: tup[1]) # sorts in place
知道怎么把它从大到小分类吗?
@Billwild:帮助(已排序)。反转=真。
@Stephen使用itemgetter更快更简单:key=itemgetter(1),在文件开头:from operator import itemgetter。
工作得很好,但是有人能对这里的语法做点评论吗?
sorted_by_second=sorted(data,key=lambda tup:tup[1])[::-1]还执行从大到小的排序工作。
@pacodelumberg:这应该通过参数reverse=True来完成。
第一个坏了
@在第二个例子中,sort是python的List对象的一个方法,它接收一个lambda函数作为其key参数。你可以把它命名为tup,或者t,或者随便你喜欢什么,它仍然有效。tup这里指定了列表元组的索引,所以1意味着排序将由原始列表(2, 5, 8中的第二个元组值执行。
我有点怀疑"使用itemgetter更快更简单"这一未经证实的说法。虽然我主观上认为直观的lambda方法比非直观的itemgetter类更简单,但itemgetter确实看起来更快。我很好奇为什么会这样。我粗略的怀疑是,一个lambda会产生将所有局部变量捕获到一个封闭上下文中的隐藏成本,而一个itemgetter实例则不会。医生:总是使用itemgetter,因为速度会赢。
x=[[[5,3]、1.0345]、[[5,6]、5.098]、[[5,4]、4.89]、[[5,1]、5.97]]这样的列表,我们如何对x[0][1]中的元素进行排序?
出于好奇,哪一个更快,第一个还是第二个选项(两者都有itemgetter)?还是复制到位与新变量的方法相同?
我在这里使用的lambda和itemgetter之间做了一个更彻底的基准测试。itemgetter总是比lambda快。
from operator import itemgetter
data.sort(key=itemgetter(1))
这应该是公认的答案。另请参见charlie发布的计时,显示itemgetter类的排序平均比等效lambda函数快126%。
x=[[[5,3]、1.0345]、[[5,6]、5.098]、[[5,4]、4.89]、[[5,1]、5.97]]这样的列表,我们能用itemgetter()对x[0][1]中的元素进行排序吗?
x=[[[5,3]、1.0345]、[[5,6]、5.098]、[[5,4]、4.89]、[[5,1]、5.97]]这样的列表,我们如何对x[0][1]中的元素进行排序?
您还可以按层次结构按多个索引排序,例如data.sort(key=itemgetter(3,1))。
这应该是公认的答案。
如果我有元组列表,如何使用itemgetter?我的意思是,内部列表包含元组,如何根据元组中的第二个元素进行排序?
现在我想添加到斯蒂芬的答案,如果你想在阵列的品种从高到低的另一个方式,比其他的,以上只是to add this to the线: </P >
reverse = True
和作为结果将是: </P >
data.sort(key=lambda tup: tup[1], reverse=True)
在多准则排序村"的村庄,namely为第二和第三个元素的元组,让我们 </P >
data = [(1,2,3),(1,2,1),(1,1,4)]
所以我define Aλ,剧情是一describes元组级的。" </P >
sorted(data, key=lambda tup: (tup[1],tup[2]) )
[(1, 1, 4), (1, 2, 1), (1, 2, 3)]
斯蒂芬的答案是一个"使用。对完全性,这里的"DSU(decorate变undecorate)模式和战略的理解: </P >
decorated = [(tup[1], tup) for tup in data]
decorated.sort()
undecorated = [tup for second, tup in decorated]
或者,更简单: </P >
[b for a,b in sorted((tup[1], tup) for tup in data)]
在Python作为noted排序PCMCIA-HOWTO得到最新的资料,这已被终止,因为Python 2.4 unnecessary密钥函数时,became可用。 </P >
所以这个答案对python2.3-很有用?在更为流行的Python版本中,是否有一些有效的用法,您可以对此进行详细说明?如果不是的话,没什么麻烦……只是路过,看到这个,老诺金就开始搅动一下。不管怎样,干杯和感谢这次回到早期的Python。
为了发展战略品种(A)元组(, ),count进入descending命令和wordalphabetical输入命令: </P >
data = [
('betty', 1),
('bought', 1),
('a', 1),
('bit', 1),
('of', 1),
('butter', 2),
('but', 1),
('the', 1),
('was', 1),
('bitter', 1)]
在使用这个方法: </P >
sorted(data, key=lambda tup:(-tup[1], tup[0]))
和信息技术,我的结果: </P >
[('butter', 2),
('a', 1),
('betty', 1),
('bit', 1),
('bitter', 1),
('bought', 1),
('but', 1),
('of', 1),
('the', 1),
('was', 1)]
没有λ: </P >
def sec_elem(s):
return s[1]
sorted(data, key=sec_elem)
"斯蒂芬回答冰的点。这里是以最好的方法visualization; </P >
喊出来的,"一个准备好的球员的球迷!=) </P >
>>> 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将要变换的Collection items方法的比较。compareToJAVA类的方法。 </P >
通过对关键的参数必须是什么这是可赎回的。在这里,使用安lambda创建匿名函数(这是一个可赎回)。 《语法:λλ其次是字村(一个元素名称,然后单块的一部法典。 </P >
下面的实例,我们是排序的列表的信息的元组,阿布特拥有某些事件的时间和人员的名字。 </P >
这是我们村庄的战略排序事件发生的时间-这是一张元素的元组。 </P >
s.sort([cmp[, key[, reverse]]])种笔记《项目部的地方 </P >
itemgetter()冰somewhat阿姨比lambda tup: tup[1]冰,但增长相对温和的(全面10到25个百分点)。 </P >
(ipython会议) </P >
>>> 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
排序(A)元组的冰quite简单: </P >
tuple(sorted(t))