Liste listesini iç listenin belirli bir dizinine göre nasıl sıralayabilirim?


Yanıtlar:


321

Bu itemgetter için bir iş

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

Burada bir lambda işlevi kullanmak da mümkündür, ancak bu basit durumda lambda işlevi daha yavaştır


Davayı görmezden gelmek istersem ne olur?
bzupnick

5
@bzupnick, kullan key=lambda x:x[2].casefold(). Python'unuz yeterince yeni değilse, .lower()yerine kullanın.casefold()
John La Rooy

x = [[[5,3], 1.0345], [[5,6], 5.098], [[5,4], 4.89], [[5,1], 5.97]] Böyle bir liste ile x [0] [1] öğelerine göre itemgetter () kullanarak sıralama yaparız?
nidHi

Sıralamanın indekslerini de alabilir miyim, böylece ilgili başka bir liste listesini aynı sırayla sıralamak için?
quarky

@quaryk Kulağa ilginç bir soru gibi geliyor ama yorumlarda cevap vermek uygun değil. Bu konuyu kapsayan bir soru bulamazsanız, bir soru oluşturmanız gerekir.
John La Rooy

175

yerinde

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

sıralanmış kullanarak yerinde değil:

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

4
in placeVe hakkında daha fazla bilgi verebilir misiniz not in place?
qun

9
@qun, "yerinde", eski listenin belleğinin sıralanmış liste için yeniden kullanıldığı anlamına gelir. "yerinde değil", eski listenin değişmeden kaldığı ve yeni bir listenin oluşturulduğu anlamına gelir.
John La Rooy

x = [[[5,3], 1.0345], [[5,6], 5.098], [[5,4], 4.89], [[5,1], 5.97]] Böyle bir listeyle, x [0] [1] 'deki elemanlara göre nasıl sıralayabiliriz?
nidHi

81

Itemgetter birden çok ölçüt / sütuna göre sıralamanızı sağlar:

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

5
Bence bu cevap çok önemli. Bence iç dizi indekslerine göre sıralamaya çalışan insanlar buraya düşecek ama MULTIPLE iç dizi indekslerine göre sıralamak isteyen insanlar burada başlayacak ve cevabınız itemgetter'ın aslında sizin için yapacağını görmeme yardımcı oldu!
ZekeDroid

11

lambda fonksiyonu ile birden fazla kriter de uygulanabilir

sorted_list = sorted(list_to_sort, key=lambda x: (x[1], x[0]))

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

Bu snippet'i kullanarak kolayca sıralayabilirsiniz, burada 1 öğenin dizinidir.


8

Bunun gibi:

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

8

Bence lambda fonksiyonu probleminizi çözebilir.

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

yanılıyorsam beni düzeltin ama iç içe listedeki 3. öğeyi değil, listedeki 3. öğeyi çağıran 'x [2]' değil mi? x [2] [2] olmalı mı?


Hayır, çünkü anahtar / lambda zaten birinci düzey listedeki öğeler üzerinde yineleniyor. x sırayla her öğeye bağlı yerel bir değişkendir.
DragonLord

1

Anlaması daha kolay (Lambda aslında ne yapıyor):

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

Çok Boyutlu Bir Diziyi Sıralama Burada yürütün

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.