Grupları ikinci parametreye göre sıralayın


94

Şuna benzeyen bir grup listem var:

("Person 1",10)
("Person 2",8)
("Person 3",12)
("Person 4",20)

Üretilmesini istediğim şey, başlığın ikinci değerine göre artan sırada sıralanan listedir. Bu yüzden L [0] ("Person 2", 8)sıralamadan sonra olmalıdır .

Bunu nasıl yapabilirim? Python 3.2.2 Kullanmak İşe yararsa.


Yanıtlar:


188

keyParametreyi şu amaçlarla kullanabilirsiniz list.sort():

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

veya biraz daha hızlı

my_list.sort(key=operator.itemgetter(1))

(Herhangi bir modülde olduğu gibi, import operatoronu kullanabilmeniz gerekir.)


3
Kodumda kullanmayı denedim L.sort(key=operator.itemgetter(1)), ancak 'operatör' tanımlı olmayan bir NameError alıyorum. Özel bir şey içe aktarmam gerekiyor mu?
user974703

3
Biraz arama yaptım import operator, işlevi kullanmak için kullanmanız gerekiyor . Bunu cevabınıza eklerseniz, kabul edildi olarak işaretlerim.
user974703

Timeit.timeit (varsayılan seçenekler) ile test etmek, bu iki yaklaşım arasında çok büyük bir fark yoktur: operator.itemgetter = 1.05µs, lambda = 1.25µs yineleme
Noel Evans

My_list.sort (key = operator.itemgetter (1)) çözümü için teşekkürler !! :)
aman_novice

1
Lambda anahtar kelimesinde
yeniyseniz

12

Ve eğer python 3.X kullanıyorsanız, sortedişlevi mylist'e uygulayabilirsiniz . Bu, @Sven Marnach'ın yukarıda verdiği cevaba bir ektir.

# using *sort method*
mylist.sort(lambda x: x[1]) 

# using *sorted function*
sorted(mylist, key = lambda x: x[1]) 

Bu yalnızca yeni bir liste döndüren yerleşiktir. Cevabınız halihazırda buradakilere herhangi bir katkı sağlamaz, çünkü yeni bir liste isteseydiniz sortedbunun yerine kullanacağınız açıktır list.sort.
miradulo

2
@SamuelNde Buraya kaydırdım çünkü ifadenin sıralı olup olmadığından emin değildim, bu yüzden bana yardımcı oldu.
Kırmızı Başlıklı

Evet kabul ettim, bu da bana yardımcı oldu
StackG

-1
    def findMaxSales(listoftuples):
        newlist = []
        tuple = ()
        for item in listoftuples:
             movie = item[0]
             value = (item[1])
             tuple = value, movie

             newlist += [tuple]
             newlist.sort()
             highest = newlist[-1]
             result = highest[1]
       return result

             movieList = [("Finding Dory", 486), ("Captain America: Civil                      

             War", 408), ("Deadpool", 363), ("Zootopia", 341), ("Rogue One", 529), ("The  Secret Life of Pets", 368), ("Batman v Superman", 330), ("Sing", 268), ("Suicide Squad", 325), ("The Jungle Book", 364)]
             print(findMaxSales(movieList))

çıktı -> Rogue One


Birkaç düşünce: Bu aslında soruyu cevaplamıyor (tuple'daki bir değere göre sıralanmış bir liste nasıl elde edilir); Demeti doğrudan döngünüzde açabilirsiniz (film için, listoftuples cinsinden değer:); 'tuple' türünü geçersiz kıldınız; Ve aslında tek bir liste anlayışı ile yapılabilir: (film için sıralı döndür ((değer, film), listoftuple cinsinden değer) [- 1] [1])
RFox

Neye gittiğinizi takdir ediyorum, ancak zarafetten yoksun olduğunu ve geliştirilebileceğini iddia ediyorum. Genel olarak, elementlerin sırasını böyle bir demet halinde dönüştürmek kötü bir uygulama olarak kabul edilir. Bence liste anlama ve tupple'ları açma ile ilgili noktalar hala geçerli olacaktır. Ve kabul edilen cevap yerine bu metodolojiyi kullanan herkesi caydırırım.
RFox

Beceriksizim ve çalışmak için gönderdiğiniz kodu alamadım, büyük olasılıkla bir kullanıcı hatası
Darrell White

ama biraz değiştirdi ve şüphesiz cevabınız 200 kat daha iyi.
Darrell Beyaz

def findMaxSales (listoftuples): newlist = sıralı (filmler için (değer, filmler), listoftuples cinsinden değer) yeni liste döndür [-1] [1] movieList = [("Finding Dory", 486), ("Captain America: Civil War ", 408), (" Deadpool ", 363), (" Zootopia ", 341), (" Rogue One ", 529), (" The Secret Life of Pets ", 368), (" Batman v Superman ", 330 ), ("Sing", 268), ("Suicide Squad", 325), ("The Jungle Book", 364)] print (findMaxSales (movieList))
Darrell White
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.