如何按给定索引处的元素对列表/元组的列表/元组进行排序
- 2024-11-22 08:47:00
- admin 原创
- 6
问题描述:
我在列表列表或元组列表中有一些数据,如下所示:
data = [[1,2,3], [4,5,6], [7,8,9]]
data = [(1,2,3), (4,5,6), (7,8,9)]
我想按子集中的第 2 个元素排序。意思是按 2,5,8 排序,其中2
来自(1,2,3)
,5
来自(4,5,6)
。执行此操作的常用方法是什么?我应该在列表中存储元组还是列表?
解决方案 1:
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
解决方案 2:
from operator import itemgetter
data.sort(key=itemgetter(1))
解决方案 3:
为了按多个标准排序,例如按中的第二和第三个元素排序tuple
,让
data = [(1,2,3),(1,2,1),(1,1,4)]
因此定义一个lambda
返回tuple
描述优先级的,例如
sorted(data, key=lambda tup: (tup[1],tup[2]) )
[(1, 1, 4), (1, 2, 1), (1, 2, 3)]
解决方案 4:
如果您想从高到低对数组进行排序,我只想补充一下斯蒂芬的答案,除了上面的评论之外的另一种方法就是将其添加到行中:
reverse = True
结果如下:
data.sort(key=lambda tup: tup[1], reverse=True)
解决方案 5:
我会使用Stephen 的答案。为了完整起见,下面是带有列表理解的 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 推出关键函数以来,这已经不再是必要的。
解决方案 6:
为了对元组列表进行排序(<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)]
解决方案 7:
没有 lambda:
def sec_elem(s):
return s[1]
sorted(data, key=sec_elem)
解决方案 8:
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
解决方案 9:
@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
是一个将被调用来转换集合的项目以供比较的函数..类似于compareTo
Java 中的方法。
传递给 key 的参数必须是可调用的。在这里,使用lambda
创建一个匿名函数(可调用)。lambda
的语法是单词 lambda 后跟可迭代对象的名称,然后是单个代码块。
下面的例子,我们对包含特定事件的时间和演员姓名信息的元组列表进行排序。
我们根据事件发生的时间(即元组的第 0 个元素)对此列表进行排序。
注意 -s.sort([cmp[, key[, reverse]]])
对 s 中的项进行排序
解决方案 10:
我在我的代码中使用了这个:
#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*])
解决方案 11:
对元组进行排序非常简单:
tuple(sorted(t))
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件