Bagaimana cara mengurutkan daftar daftar dengan indeks spesifik dari daftar dalam?

Jawaban:

321

Ini adalah pekerjaan untuk 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']]

Dimungkinkan juga untuk menggunakan fungsi lambda di sini, namun fungsi lambda lebih lambat dalam kasus sederhana ini

John La Rooy
sumber
Bagaimana jika saya ingin mengabaikan kasus?
bzupnick
5
@ bzupnick, gunakan key=lambda x:x[2].casefold(). Jika Python Anda tidak cukup baru, gunakan .lower()saja.casefold()
John La Rooy
x = [[[5,3], 1.0345], [[5,6], 5.098], [[5,4], 4.89], [[5,1], 5.97]] Dengan daftar seperti ini dapat kita urutkan menggunakan itemgetter () sehubungan dengan elemen dalam x [0] [1]?
nidHi
Bisakah saya juga mendapatkan indeks semacam itu, jadi untuk mengurutkan daftar daftar terkait lainnya dalam urutan yang sama?
quarky
@quaryk Kedengarannya seperti pertanyaan yang menarik, tetapi tidak cocok untuk dijawab dalam komentar. Jika Anda tidak dapat menemukan pertanyaan yang membahasnya, Anda harus membuatnya.
John La Rooy
175

di tempat

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

tidak pada tempatnya menggunakan yang diurutkan:

>>> sorted(l, key=lambda x: x[2])
mouad
sumber
4
Bisakah Anda memberikan detail lebih lanjut tentang in placedan not in place?
qun
9
@ qun, "di tempat" berarti bahwa memori daftar lama digunakan kembali untuk yang diurutkan. "not in place" berarti bahwa daftar lama tetap tidak berubah dan daftar baru dibuat.
John La Rooy
x = [[[5,3], 1.0345], [[5,6], 5.098], [[5,4], 4.89], [[5,1], 5.97]] Dengan daftar seperti ini adalah, bagaimana kita mengurutkan sehubungan dengan elemen dalam x [0] [1]?
nidHi
81

Itemgetter memungkinkan Anda untuk mengurutkan berdasarkan beberapa kriteria / kolom:

sorted_list = sorted(list_to_sort, key=itemgetter(2,0,1))
fider
sumber
5
Saya pikir jawaban ini sangat penting. Saya pikir orang yang mencoba mengurutkan berdasarkan indeks array dalam akan jatuh di sini tetapi orang yang mencari untuk mengurutkan berdasarkan indeks array dalam BERGANDA akan mulai di sini dan jawaban Anda membantu saya melihat bahwa itemgetter benar-benar akan melakukannya untuk Anda!
ZekeDroid
11

beberapa kriteria juga dapat diimplementasikan melalui fungsi lambda

sorted_list = sorted(list_to_sort, key=lambda x: (x[1], x[0]))
Rahul Kumar
sumber
10
array.sort(key = lambda x:x[1])

Anda dapat dengan mudah mengurutkan menggunakan cuplikan ini, di mana 1 adalah indeks elemen.

Abhishek Yadav
sumber
8

Seperti ini:

import operator
l = [...]
sorted_list = sorted(l, key=operator.itemgetter(desired_item_index))
Jim Brissom
sumber
8

Saya pikir fungsi lambda dapat menyelesaikan masalah Anda.

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']]
Tushar Niras
sumber
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])**

koreksi saya jika saya salah tetapi bukankah 'x [2]' memanggil item ke-3 dalam daftar, bukan item ke-3 dalam daftar bersarang? haruskah x [2] [2]?

EgmontDeVos
sumber
Tidak, karena key / lambda sudah mengulang item di daftar tingkat pertama. x adalah variabel lokal yang terikat pada setiap item secara bergantian.
DragonLord
1

Lebih mudah dipahami (Apa yang sebenarnya dilakukan 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)
Maz1978
sumber
0

Menyortir Array Multidimensi dijalankan di sini

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)
Nishan
sumber