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


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])

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

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]))

10
array.sort(key = lambda x:x[1])

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


8

Seperti ini:

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

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']]

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]?


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)

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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.