在Python中按子列表的值排序

1 投票
3 回答
2247 浏览
提问于 2025-04-16 22:42

我的列表里有一些元素,格式是这样的:

(23, (12,16,42))

我现在的简单排序方法是默认按照子列表中的第一个值来排序。

value = sorted(list, key=itemgetter(1))

我想使用第二层排序选项,具体可以参考这个链接 http://wiki.python.org/moin/HowTo/Sorting/

sorted(student_tuples, key=itemgetter(1,2))

那么,子列表中的每个项目都有一个地址吗?我试着找一些括号或冒号的表示法,但还没找到,我想应该是这样的。

这是一个未排序的列表的例子:

(0, (81.0, 5.0, 83.0)), (1, (81.0, 1.0, 26.0)), (2, (80.0, 1.0, 44.0)), 

输出结果会类似于:

(2, (80.0, 1.0, 44.0)), (1, (81.0, 1.0, 26.0)), (0, (81.0, 5.0, 83.0))

(w, (x,y,z))

所以第一次排序是根据x值。如果有多个相同的x值,就会根据y值进行排序。

3 个回答

2

一般来说,如果你想按照多个属性进行排序,可以使用一个函数,这个函数会返回一个元组。之所以这样做是因为Python会从左到右对元组进行排序,所以听起来你正想要这样做。

>>> L=(0, (81.0, 5.0, 83.0)), (1, (81.0, 1.0, 26.0)), (2, (80.0, 1.0, 44.0)),
>>> sorted(L, key=lambda x:(x[1][0],x[1][1]))
[(2, (80.0, 1.0, 44.0)), (1, (81.0, 1.0, 26.0)), (0, (81.0, 5.0, 83.0))]

因为你想排序的字段顺序和元组中的顺序是一样的,所以你可以简化成这样。

>>> sorted(L, key=lambda x:x[1])
[(2, (80.0, 1.0, 44.0)), (1, (81.0, 1.0, 26.0)), (0, (81.0, 5.0, 83.0))]

这样你就可以简单地回到这个。

>>> sorted(L, key=itemgetter(1))
[(2, (80.0, 1.0, 44.0)), (1, (81.0, 1.0, 26.0)), (0, (81.0, 5.0, 83.0))]

但希望现在你能明白为什么这样做确实能按照你想要的顺序对元素进行排序。

4

自己定义一下:

sorted(list, key=lambda item: item[0][1])
# or whatever other sort of indexing you want

在你的情况下,你想要的索引是:

sorted(list, key=lambda item: (item[1][0], item[1][1]))

因为比较元组时是逐个比较里面的元素。key 是一个可以调用的东西,它可以把这些项目转换成可以直接比较的东西,这样就能得到你想要的比较结果。

-1
>>> a = [23, [5, 6, 7]]
>>> a[1][0]
5

子列表其实是一个项目,所以你需要用一对括号来获取这个子列表,然后再用另一对括号来访问子列表中的具体内容。

撰写回答