2013-08-14 16 views
5

Czy istnieją standardowe biblioteki Pythona, które umożliwiają wykonywanie takich czynności?Wszelkie standardowe biblioteki Pythona zapewniające dzielenie funkcji łączenia na listach?

>>> [1,0,2,3,0,5,6].split([0]) 
>>> [[1],[2,3],[5,6]] 

>>> [[1],[2,3],[5,6]].join([0]) 
>>> [1,0,2,3,0,5,6] 

Dla mnie to czuje się jak bardzo podstawowe rzeczy, które potrzebne są dość często. Należy zauważyć, że łańcuchy obsługują te metody domyślnie.

+0

ciekaw, dlaczego zrobiłeś swoje argumenty metoda list pojedynczego elementu '.split ([0])'. Czy wyobrażasz sobie, że te funkcje powinny być w stanie dzielić na wiele kolejnych elementów sekwencji? – MattH

+0

@MattH To jest podobne do metody podziału na ciągi: ''spam'.split (' pa ')' zwraca '[' s ',' m ']' –

+0

Interesujące. W każdym razie, wierzę, że odpowiedź na twoje pytanie brzmi: nie, nie ma standardowej funkcji bibliotecznej do dzielenia list na podstawie podciągów – MattH

Odpowiedz

1

Nie wiem, czy jakieś funkcje wbudowane są obecne to zrobić łatwo, ale można użyć itertools:

>>> from itertools import groupby, chain, islice, cycle 
>>> lis = [1,0,2,3,0,5,6] 
>>> [list(g) for k, g in groupby(lis, key =lambda x: x==0) if not k] 
[[1], [2, 3], [5, 6]] 

>>> lis1 = [[1],[2,3],[5,6]] 
>>> c = [[0]]*(len(lis1) - 1) 
>>> list(chain.from_iterable(roundrobin(lis1, c))) 
[1, 0, 2, 3, 0, 5, 6] 

Roundrobin przepis stosowany w drugim:

def roundrobin(*iterables): 
    "roundrobin('ABC', 'D', 'EF') --> A D E B F C" 
    # Recipe credited to George Sakkis 
    pending = len(iterables) 
    nexts = cycle(iter(it).next for it in iterables) 
    while pending: 
     try: 
      for next in nexts: 
       yield next() 
     except StopIteration: 
      pending -= 1 
      nexts = cycle(islice(nexts, pending)) 
0

Nie wiedzieć o standardowych bibliotekach, oto trochę niezręczne rozwiązanie dla split

>>> a = [1, 0, 2, 3, 0, 5, 6] 
>>> ind = [-1] + [i for i, x in enumerate(a) if x == 0] + [len(a)] 
>>> [a[i + 1:j] for i, j in zip(ind, ind[1:])] 
[[1], [2, 3], [5, 6]] 

Oto join

>>> l2 = [[1], [2, 3], [5, 6]] 
>>> [i for x in l2 for i in x + [0]][:-1] 
[1, 0, 2, 3, 0, 5, 6]