Listeler/tuples (liste/tuple) nasıl sıralanır?

listelerin bir listesinde veya tuples listesinde bazı verilerim var, şöyle:

data = [[1,2,3], [4,5,6], [7,8,9]]
data = [(1,2,3), (4,5,6), (7,8,9)]

ve alt kümedeki 2. öğeye göre sıralamak istiyorum. Anlamı, 2'den (1,2,3), 5'ten (4,5,6) olan 2,5,8'e göre sıralama. Bunu yapmanın ortak yolu nedir? Listemde tuples veya listeleri saklamalı mıyım?

440
tarihinde sordu codeforester 2010-06-26 03:01:41
kaynak

10 ответов

sorted_by_second = sorted(data, key=lambda tup: tup[1])

veya:

data.sort(key=lambda tup: tup[1])  # sorts in place
797
cevap Stephen 2015-01-05 12:46:34
kaynak
from operator import itemgetter
data.sort(key=itemgetter(1))
150
cevap manova 2013-11-11 12:18:15
kaynak

diziyi yüksekten düşüğe sıralamak istiyorsanız Stephen'ın cevabına eklemek istiyorum, yukarıdaki yorumlardan başka bir yol da bunu satıra eklemek:

reverse = True

ve sonuç aşağıdaki gibi olacaktır:

data.sort(key=lambda tup: tup[1], reverse=True)
37
cevap sifoo 2017-03-07 02:20:54
kaynak

Stephen's answer ben kullanacağım biridir. Tamlık için, liste kavrayışları ile dsu (decorate-sort-undecorate) deseni:

decorated = [(tup[1], tup) for tup in data]
decorated.sort()
undecorated = [tup for second, tup in decorated]

veya, daha korkunç:

[b for a,b in sorted((tup[1], tup) for tup in data)]

Python sıralama belirtildiği gibi , bu Python 2.4 beri gereksiz olmuştur, anahtar fonksiyonları kullanılabilir hale geldiğinde.

26
cevap tcarobruce 2017-05-23 14:47:29
kaynak

birden çok kritere göre sıralama için, örneğin bir tuple ikinci ve üçüncü öğelerle

data = [(1,2,3),(1,2,1),(1,1,4)]

ve bu nedenle

gibi önceliği açıklayan bir tuple döndüren bir lambda tanımlayın
sorted(data, key=lambda tup: (tup[1],tup[2]) )
[(1, 1, 4), (1, 2, 1), (1, 2, 3)]
23
cevap elm 2015-12-20 00:27:50
kaynak

alfabetik sırayla count ve word için (<word>, <count>) tuples listesini sıralamak için:

data = [
('betty', 1),
('bought', 1),
('a', 1),
('bit', 1),
('of', 1),
('butter', 2),
('but', 1),
('the', 1),
('was', 1),
('bitter', 1)]

bu yöntemi kullanıyorum:

sorted(data, key=lambda tup:(-tup[1], tup[0]))

ve bana sonuç verir:

[('butter', 2),
('a', 1),
('betty', 1),
('bit', 1),
('bitter', 1),
('bought', 1),
('but', 1),
('of', 1),
('the', 1),
('was', 1)]
9
cevap l mingzhi 2017-02-15 08:35:22
kaynak

Lambda olmadan:

def sec_elem(s):
    return s[1] 
sorted(data, key=sec_elem) 
6
cevap Mesco 2018-01-02 18:16:51
kaynak

@ Stephen ' In cevabı noktaya! İşte daha iyi görselleştirme için bir örnek,

hazır oyuncu bir hayranları için bağırmak! =)

>>> gunters = [('2044-04-05', 'parzival'), ('2044-04-07', 'aech'), ('2044-04-06', 'art3mis')]
>>> gunters.sort(key=lambda tup: tup[0])
>>> print gunters
[('2044-04-05', 'parzival'), ('2044-04-06', 'art3mis'), ('2044-04-07', 'aech')]

key , koleksiyonun öğelerini karşılaştırma için dönüştürmek için çağrılacak bir işlevdir.. Java compareTo yöntemi gibi.

anahtara geçirilen parametre çağrılabilir bir şey olmalıdır. 151930920 'burada kullan (bir çağrı) isimsiz bir işlev oluşturur.

Lambda sözdizimi kelime lambda sonra kod tek bir blok yinelenebilir bir ad tarafından takip edilir.

aşağıda örnek, biz belirli olay ve aktör adının bilgi abt zaman tutan tuple bir listesini sıralıyoruz.

bu listeyi olay oluşma zamanına göre sıralıyoruz-bir tuple 0.öğesi.

not- s.sort([cmp[, key[, reverse]]]) öğeleri sıralar of s in place

5
cevap Rishi 2017-05-27 00:06:23
kaynak

itemgetter() lambda tup: tup[1] den biraz daha hızlıdır, ancak artış nispeten mütevazı (yaklaşık yüzde 10 ila 25).

(İPython oturumu)

>>> from operator import itemgetter
>>> from numpy.random import randint
>>> values = randint(0, 9, 30000).reshape((10000,3))
>>> tpls = [tuple(values[i,:]) for i in range(len(values))]

>>> tpls[:5]    # display sample from list
[(1, 0, 0), 
 (8, 5, 5), 
 (5, 4, 0), 
 (5, 7, 7), 
 (4, 2, 1)]

>>> sorted(tpls[:5], key=itemgetter(1))    # example sort
[(1, 0, 0), 
 (4, 2, 1), 
 (5, 4, 0), 
 (8, 5, 5), 
 (5, 7, 7)]

>>> %timeit sorted(tpls, key=itemgetter(1))
100 loops, best of 3: 4.89 ms per loop

>>> %timeit sorted(tpls, key=lambda tup: tup[1])
100 loops, best of 3: 6.39 ms per loop

>>> %timeit sorted(tpls, key=(itemgetter(1,0)))
100 loops, best of 3: 16.1 ms per loop

>>> %timeit sorted(tpls, key=lambda tup: (tup[1], tup[0]))
100 loops, best of 3: 17.1 ms per loop
4
cevap Walter 2016-09-27 08:25:13
kaynak

bir tuple sıralama oldukça basittir:

tuple(sorted(t))
-5
cevap Jayr 2014-12-31 01:28:21
kaynak

Diğer sorular python sorting list tuples