2012-07-04 14 views
5

Mam listę ciągów znaków i próbuję utworzyć listę list ciągów według długości ciągu znaków.Python: podzielona lista ciągów na listę list ciągów według długości z zagnieżdżonymi zrozumieniami

tj

['a', 'b', 'ab', 'abc'] 

staje

[['a', 'b'], ['ab'], ['abc']] 

mam osiągnąć to tak:

lst = ['a', 'b', 'ab', 'abc'] 
lsts = [] 
for num in set(len(i) for i in lst): 
    lsts.append([w for w in lst if len(w) == num]) 

jestem zadowolony z tego kodu, ale staram się owinąć moja głowa dookoła rozumienia. Chcę używać zagnieżdżonych wyrażeń, aby zrobić to samo, ale nie wiem, jak to zrobić.

Odpowiedz

4
>>> [[w for w in L if len(w) == num] for num in set(len(i) for i in L)] 
[['a', 'b'], ['ab'], ['abc']] 

Również, itertools jest prawdopodobnie bardziej wydajny.

+1

Nicei. Dziękuję Ci. – dustin

0

To jest dla wszystkich długościach od 1 do maksimum (niektóre z list będzie pusta, jeśli nie istnieją ciągi tej długości na liście a):

>>> a = ['a', 'b', 'ab', 'abc'] 
>>> m = max(len(x) for x in a) 
>>> print [[x for x in a if len(x) == i + 1] for i in range(m)] 
[['a', 'b'], ['ab'], ['abc']] 

Ale jeśli chcesz mieć tylko list do długości, które są w a musisz użyć set(len(i) for i in lst) zamiast zakresu.

>>> print [[x for x in a if len(x) == i] for i in set(len(k) for k in a)] 
[['a', 'b'], ['ab'], ['abc']] 

Nie ma różnicy do listy ['a', 'b', 'ab', 'abc']. Ale jeśli to zmienić trochę, na przykład tak: [['a', 'b'], ['ab'], ['abcd']], zobaczysz różnicę:

>>> a = ['a', 'b', 'ab', 'abcd'] 
>>> print [[x for x in a if len(x) == i] for i in set(len(k) for k in a)] 
[['a', 'b'], ['ab'], ['abcd']] 

>>> print [[x for x in a if len(x) == i + 1] for i in range(max(len(x) for x in a))] 
[['a', 'b'], ['ab'], [], ['abcd']] 
1
lst = ['a', 'b', 'ab', 'abc'] 
lst.sort(key=len) # does not make any change on this data,but 
        # all strings of given length must occur together 


from itertools import groupby 
lst = [list(grp) for i,grp in groupby(lst, key=len)] 

wyników w

[['a', 'b'], ['ab'], ['abc']] 
+0

stabilne sortowanie ... 'key = len' (także na groupby) – JBernardo

+0

@JBernardo: dziękuję, myślałem o tym, ale biłeś mnie do tego ;-) –

+1

Upuść' lambda'. Po prostu spowolni kod: – JBernardo

0
L=['a','b','ab','abc'] 
result = [ [ w for w in L if len(w) == n] for n in set(len(i) for i in L)] 
0
from itertools import groupby 

mylist = ['a', 'b', 'ab', 'abc'] 
[list(vals) for key, vals in groupby(mylist, lambda L: len(L))] 

zauważyć, że ponieważ GroupBy działa tylko na sąsiednich elementach - może być konieczne wymuszenie sortowania na liście z kluczem = len)

  • zwraca iterator za pomocą klucza (który będzie długością) oraz vals, który jest kolejnym iteratorem zawierającym dane w tej grupie kluczy.
  • następnie konwertuje iterator danych do listy
  • lista zewnątrz zostaje zbudowany z powyższym

  • -