Czy można podzielić ciąg co n-ty znak?
Załóżmy na przykład, że mam ciąg znaków zawierający następujące elementy:
'1234567890'
Jak mogę to wyglądać tak:
['12','34','56','78','90']
>>> line = '1234567890'
>>> n = 2
>>> [line[i:i+n] for i in range(0, len(line), n)]
['12', '34', '56', '78', '90']
Aby być kompletnym, możesz to zrobić za pomocą wyrażenia regularnego:
W przypadku nieparzystej liczby znaków możesz to zrobić:
Możesz również wykonać następujące czynności, aby uprościć wyrażenie regularne dla dłuższych fragmentów:
I możesz użyć,
re.finditer
jeśli ciąg jest długi, aby wygenerować porcję po porcji.źródło
'.'*n
aby było bardziej jasne. Bez łączenia, bez zipowania, bez pętli, bez zrozumienia listy; po prostu znajdź obok siebie kolejne dwie postacie, dokładnie tak, jak myśli o tym ludzki mózg. Gdyby Monty Python nadal żył, pokochałby tę metodę!flags=re.S
.W tym języku jest już wbudowana funkcja.
Oto, co mówi dokument do zawijania:
źródło
wrap
może nie zwrócić tego, o co jest poproszony, jeśli ciąg zawiera spację. np.wrap('0 1 2 3 4 5', 2)
zwraca['0', '1', '2', '3', '4', '5']
(elementy są rozebrane)Innym popularnym sposobem grupowania elementów w grupy o długości n:
Ta metoda pochodzi prosto z dokumentacji dla
zip()
.źródło
zip(*[iter(s)]*2)
trudno jest zrozumieć, przeczytaj Jakzip(*[iter(s)]*n)
działa Python? .>>> map(''.join, zip(*[iter('01234567')]*5))
->['01234']
zip()
zitertools.zip_longest()
:map(''.join, zip_longest(*[iter(s)]*2, fillvalue=''))
maps()
Myślę, że jest to krótszy i bardziej czytelny niż wersja itertools:
źródło
Podoba mi się to rozwiązanie:
źródło
Używanie narzędzi itertools z PyPI:
źródło
Możesz użyć
grouper()
przepisu zitertools
:Python 2.x:
Python 3.x:
Funkcje te są wydajne pod względem pamięci i działają z dowolnymi iteracjami.
źródło
Wypróbuj następujący kod:
źródło
yield ''.join(piece)
aby działała zgodnie z oczekiwaniami: eval.in/813878źródło
Spróbuj tego:
Wynik:
źródło
Jak zawsze dla tych, którzy kochają jedną wkładkę
źródło
print(line)
otrzymujęthis is a line split into n characters
jako wynik. Może być lepiej oddanie:line = [line[i * n:i * n+n] for i,blah in enumerate(line[::n])]
? Napraw to i to dobra odpowiedź :).,blah
i dlaczego jest to konieczne? Zauważyłem, że mogę zastąpićblah
dowolnym znakiem / literami alfa, ale nie cyframi, i nie mogę usunąćblah
przecinka lub. Mój redaktor sugeruje dodanie spacji po,
: senumerate
zwraca dwie iterowalne, więc potrzebujesz dwóch miejsc do ich umieszczenia. Ale w tym przypadku tak naprawdę nie potrzebujesz drugiej iteracji.blah
wolę używać podkreślenia lub podwójnego podkreślenia, patrz: stackoverflow.com/questions/5893163/…Proste rekurencyjne rozwiązanie dla krótkiego łańcucha:
Lub w takiej formie:
, która bardziej szczegółowo ilustruje typowy wzór dziel i zwyciężaj w podejściu rekurencyjnym (chociaż praktycznie nie jest to konieczne)
źródło
Utknąłem w tym samym scenariuszu.
To zadziałało dla mnie
Wynik
źródło
more_itertools.sliced
zostało wspomniane wcześniej. Oto cztery dodatkowe opcje zmore_itertools
biblioteki:Każda z tych ostatnich opcji generuje następujące dane wyjściowe:
Dokumentacja dla omawianych opcji:
grouper
,chunked
,windowed
,split_after
źródło
Można to osiągnąć za pomocą prostej pętli for.
Wyjście wygląda następująco: „12”, „34”, „56”, „78”, „90”, „a”]
źródło