2010-09-08 20 views
7

Mam nieposortowaną listę liczb całkowitych na liście Pythona. Chcę posortować elementy w podzbiorze pełnej listy, a nie całą pełną listę. Chcę również posortować listę w miejscu, aby nie tworzyć nowych list (robię to bardzo często). Początkowo próbowałSortowanie podlisty w obrębie listy Pythona liczb całkowitych

p[i:j].sort() 

ale to nie zmienia zawartości p przypuszczalnie dlatego, że nowa lista powstała, sortowane, a następnie wyrzuca się bez wpływania na zawartość oryginalnej listy. Mogę, oczywiście, utworzyć własną funkcję sortowania i użyć pętli do wybrania odpowiednich elementów, ale nie jest to pythonic. Czy istnieje lepszy sposób sortowania podlist na miejscu?

Odpowiedz

15

Możesz napisać p[i:j] = sorted(p[i:j])

+0

+1: Pokonaj mnie sekundami dzięki prostszemu rozwiązaniu. –

+1

Nadal nie jest to, czego żąda operator, ale co zamierzałem zasugerować. Musi jeszcze utworzyć osobną tablicę podrzędną i posortować ją przed przypisaniem jej do 'p [i: j]'. Od jakiegoś czasu myślałem, że powinna być opcja sort(), aby określić zakres do sortowania. To wyeliminowałoby niepotrzebne zużycie pamięci. –

+1

To z pewnością odnosi się do "jak", ale czy nie spowoduje to utworzenia co najmniej 2 nowych list? Jeden dla p [i: j] w środku posortowany, a drugi dla wyniku posortowanego. – sizzzzlerz

0

"w miejscu" nie znaczy wiele. Chcesz to.

p[i:j] = list(sorted(p[i:j])) 
-1

Dzieje się tak, ponieważ p [i: j] zwraca nową listę. Mogę myśleć o tym natychmiastowym rozwiązaniu:

l = p[i:j] 
l.sort() 
a = 0 
for x in range(i, j): 
    p[x] = l[a] 
    a += 1 
+0

Możesz po prostu napisać 'p [i: j] = l'' – kennytm

Powiązane problemy