如何按内部列表的特定索引对列表列表进行排序?


Answers:


320

这是itemgetter的工作

>>> from operator import itemgetter
>>> L=[[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']]
>>> sorted(L, key=itemgetter(2))
[[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']]

也可以在此处使用lambda函数,但是在这种简单情况下,lambda函数的运行速度较慢


如果我想忽略大小写怎么办?
bzupnick13年

5
@bzupnick,使用key=lambda x:x[2].casefold()。如果您的Python不够新,请使用.lower()代替.casefold()
John La Rooy

x = [[[5,3],1.0345],[[5,6],5.098],[[5,4],4.89],[[5,1],5.97]]这样的列表可以我们对x [0] [1]中的元素使用itemgetter()进行排序?
nidHi

我还可以获取排序的索引,以便以相同顺序对另一个相关列表列表进行排序吗?
夸张的

@quaryk这听起来像是一个有趣的问题,但不适合在评论中回答。如果找不到涵盖该问题的问题,则应创建一个问题。
约翰·拉鲁伊

175

到位

>>> l = [[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']]
>>> l.sort(key=lambda x: x[2])

使用排序不到位:

>>> sorted(l, key=lambda x: x[2])

4
您能否提供有关in place和的更多详细信息not in place
2015年

9
@qun,“就位”表示将旧列表的内存重新用于已排序的列表。“不在适当位置”表示旧列表保持不变,并且创建了新列表。
John La Rooy

x = [[[5,3],1.0345],[[5,6],5.098],[[5,4],4.89],[[5,1],5.97]]这样的列表是,如何对x [0] [1]中的元素进行排序?
nidHi

81

Itemgetter使您可以按多个条件/列进行排序:

sorted_list = sorted(list_to_sort, key=itemgetter(2,0,1))

5
我认为这个答案非常重要。我认为尝试按内部数组索引进行排序的人会落在这里,但是希望按MULTIPLE内部数组索引进行排序的人会从这里开始,您的回答帮助我看到itemgetter实际上会为您做到这一点!
ZekeDroid 2014年



8

像这样:

import operator
l = [...]
sorted_list = sorted(l, key=operator.itemgetter(desired_item_index))

8

我认为lambda函数可以解决您的问题。

old_list = [[0,1,'f'], [4,2,'t'],[9,4,'afsd']]

#let's assume we want to sort lists by last value ( old_list[2] )
new_list = sorted(old_list, key=lambda x: x[2])

#Resulst of new_list will be:

[[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']]

2
**old_list = [[0,1,'f'], [4,2,'t'],[9,4,'afsd']]
    #let's assume we want to sort lists by last value ( old_list[2] )
    new_list = sorted(old_list, key=lambda x: x[2])**

如果我错了,请纠正我,但不是'x [2]'调用列表中的第三项,而不是嵌套列表中的第三项吗?应该是x [2] [2]吗?


否,因为key / lambda已经在第一级列表中的项目上进行迭代。x是依次绑定到每个项目的局部变量。
DragonLord

1

更容易理解(Lambda实际在做什么):

ls2=[[0,1,'f'],[4,2,'t'],[9,4,'afsd']]
def thirdItem(ls):
    #return the third item of the list
    return ls[2]
#Sort according to what the thirdItem function return 
ls2.sort(key=thirdItem)

0

排序多维数组在这里执行

arr=[[2,1],[1,2],[3,5],[4,5],[3,1],[5,2],[3,8],[1,9],[1,3]]



arr.sort(key=lambda x:x[0])
la=set([i[0] for i in Points])

for i in la:
    tempres=list()
    for j in arr:
        if j[0]==i:
            tempres.append(j[1])

    for j in sorted(tempres,reverse=True):
        print(i,j)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.