2012-12-31 5 views
6

My Python listy sznurka jest coś takiego jak x ale wystarczająco długo:Długość mądry posortowane lista, ale sama długość w alfabetycznym rzędu w etapie

x = ['aaa','ab','aa','c','a','b','ba']  

ja chce uporządkować tę listę jako: ['a', 'b', 'c', 'aa', 'ab', 'ba', 'aaa'] i ja robiłem w następujący dwa etapach:

>>> x.sort() 
>>> x.sort(key=len)  
>>> x 
['a', 'b', 'c', 'aa', 'ab', 'ba', 'aaa'] 

Ale muszę w jednym kroku: ja również związany z użyciem lambda funkcję (taken help):

>>> x.sort(key=lambda item: (item, len(item))) 
>>> x 
['a', 'aa', 'aaa', 'ab', 'b', 'ba', 'c'] 

Ale nie tak chciałem:

Czy to możliwe, w jednym kroku? Proszę mnie.

My Python:

~$ python --version 
Python 2.6.6 
+0

I edycji tag 'python-2.7' do' python-2.6' jak wyraźnie stwierdzić używasz 2.6. –

Odpowiedz

9

Masz kolejność krotki na odwrót. Gdy Python sortuje krotki, pierwszą wartością jest sortowanie , przy czym drugim jest subsort, itd ... - Twój kod zakłada kolejność odwrotną.

chcesz sortować według długości, następnie alfabetycznie:

>>> x.sort(key=lambda item: (len(item), item)) 
>>> x 
['a', 'b', 'c', 'aa', 'ab', 'ba', 'aaa'] 

Edit: Jak DSM zwraca uwagę w komentarzach, jak Python sortuje listy stolic, potem małe. Jeśli to zachowanie nie jest pożądane, zobacz this answer.

+0

Ahaa! Co próbowałem źle? Próbowałem zbyt wiele razy. –

+0

@GrijeshChauhan Wyjaśniam, co było nie tak w odpowiedzi ... –

+0

To faktycznie nie sortuje alfabetycznie z powodu problemów z przypadkiem (ale to łatwo naprawić). [Przyznaję, że lista OP jest teraz w całości mała). – DSM

1

użyciu itertools.grouby():

In [29]: lis = ['aaa','ab','aa','c','a','b','ba'] 
In [30]: list(chain(*[sorted(g) for k,g in groupby(sorted(lis,key=len),key=len)])) 
Out[30]: ['a', 'b', 'c', 'aa', 'ab', 'ba', 'aaa'] 

timeit porównania:

In [38]: x = ['aaa','ab','aa','c','a','b','ba']*1000 

In [39]: random.shuffle(x) 

#may be in more tricky test cases this would be fast 

In [40]: %timeit sorted(x,key=lambda item: (len(item), item)) 
100 loops, best of 3: 11.3 ms per loop 

In [41]: %timeit list(chain(*[sorted(g) for k,g in groupby(sorted(x,key=len),key=len)])) 
100 loops, best of 3: 7.82 ms per loop 
+2

Wydaje się to bardzo skomplikowane. Nie jest źle, ale ... Naprawdę nie widzę jego wartości. –

+1

Lubię 'itertools' tak samo jak następny facet, ale to jest szalone, zwariowane! PS: nie potrzebujesz wywołania 'list',' posortowane' pochłonie 'g' i stworzy listę. – DSM

+0

@Ashwini Dzięki! .. nowa technika :) .. –

Powiązane problemy