Ist es möglich, jedes n-te Zeichen eine Zeichenfolge zu teilen?
Angenommen, ich habe eine Zeichenfolge, die Folgendes enthält:
'1234567890'
Wie kann ich es so aussehen lassen:
['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']
Um vollständig zu sein, können Sie dies mit einem regulären Ausdruck tun:
Für eine ungerade Anzahl von Zeichen können Sie dies tun:
Sie können auch Folgendes tun, um den regulären Ausdruck für längere Abschnitte zu vereinfachen:
Und Sie können verwenden,
re.finditer
wenn die Zeichenfolge lang ist, um Chunk für Chunk zu generieren.quelle
'.'*n
, um es klarer zu machen. Kein Beitritt, kein Zippen, keine Schleifen, kein Listenverständnis; Finden Sie einfach die nächsten zwei Zeichen nebeneinander, genau so denkt ein menschliches Gehirn darüber. Wenn Monty Python noch am Leben wäre, würde er diese Methode lieben!flags=re.S
.Dafür gibt es in Python bereits eine eingebaute Funktion.
Dies ist, was der Docstring für Wrap sagt:
quelle
wrap
gibt möglicherweise nicht zurück, wonach gefragt wird, wenn die Zeichenfolge Leerzeichen enthält. zBwrap('0 1 2 3 4 5', 2)
kehrt zurück['0', '1', '2', '3', '4', '5']
(die Elemente werden entfernt)Eine weitere gängige Methode zum Gruppieren von Elementen in Gruppen mit n Längen:
Diese Methode stammt direkt aus den Dokumenten für
zip()
.quelle
zip(*[iter(s)]*2)
Schwierigkeiten hat zu verstehen, lesen Sie Wie funktioniert eszip(*[iter(s)]*n)
in Python? .>>> map(''.join, zip(*[iter('01234567')]*5))
->['01234']
zip()
mititertools.zip_longest()
:map(''.join, zip_longest(*[iter(s)]*2, fillvalue=''))
maps()
Ich denke, das ist kürzer und lesbarer als die itertools-Version:
quelle
Ich mag diese Lösung:
quelle
Verwenden von more-itertools von PyPI:
quelle
Sie könnten das
grouper()
Rezept verwenden vonitertools
:Python 2.x:
Python 3.x:
Diese Funktionen sind speichereffizient und funktionieren mit allen Iterables.
quelle
Versuchen Sie den folgenden Code:
quelle
yield ''.join(piece)
, damit sie wie erwartet funktioniertquelle
Versuche dies:
Ausgabe:
quelle
Wie immer für diejenigen, die einen Liner lieben
quelle
print(line)
bekomme ichthis is a line split into n characters
als Ausgabe. Könnten Sie besser setzen :line = [line[i * n:i * n+n] for i,blah in enumerate(line[::n])]
? Repariere das und es ist eine gute Antwort :).,blah
und warum es notwendig ist? Ich stelle fest, dass ich durchblah
alle Alpha-Zeichen, aber nicht durch Zahlen, ersetzen kann und dasblah
oder / und das Komma nicht entfernen kann . Mein Redakteur schlägt vor, Leerzeichen nach dem,
folgenden hinzuzufügen : senumerate
Gibt zwei Iterables zurück, sodass Sie zwei Stellen benötigen, um sie zu platzieren. In diesem Fall benötigen Sie jedoch für nichts die zweite Iterable.blah
lieber einen Unterstrich oder einen doppelten Unterstrich zu verwenden, siehe: stackoverflow.com/questions/5893163/…Eine einfache rekursive Lösung für kurze Zeichenfolgen:
Oder in einer solchen Form:
, was das typische Teilungs- und Eroberungsmuster im rekursiven Ansatz expliziter veranschaulicht (obwohl es praktisch nicht notwendig ist, dies auf diese Weise zu tun)
quelle
Ich steckte im selben Szenario fest.
Das hat bei mir funktioniert
Ausgabe
quelle
more_itertools.sliced
wurde bereits erwähnt . Hier sind vier weitere Optionen aus dermore_itertools
Bibliothek:Jede der letzteren Optionen erzeugt die folgende Ausgabe:
Dokumentation für diskutierten Optionen:
grouper
,chunked
,windowed
,split_after
quelle
Dies kann durch eine einfache for-Schleife erreicht werden.
Die Ausgabe sieht aus wie ['12', '34', '56', '78', '90', 'a']
quelle