Wie teile ich eine Zeichenfolge in ein Array von Zeichen auf?

450

Ich habe versucht, mich im Internet nach Antworten auf die Aufteilung einer Zeichenfolge in eine Reihe von Zeichen umzusehen, aber ich kann anscheinend keine einfache Methode finden

str.split(//)scheint nicht so zu funktionieren wie Ruby. Gibt es eine einfache Möglichkeit, dies ohne Schleifen zu tun?

Adrian
quelle
12
In Python sind Zeichenfolgen bereits Arrays von Zeichen für alle Zwecke außer für das Ersetzen. Sie können sie schneiden, referenzieren oder nach Index suchen usw.
Dansalmo
4
Link in eine andere Richtung
Tobias Kienzler

Antworten:

860
>>> s = "foobar"
>>> list(s)
['f', 'o', 'o', 'b', 'a', 'r']

Sie brauchen eine Liste

user225312
quelle
2
Meiner Meinung nach viel besser als die Ruby-Methode, können Sie zwischen Sequenztypen frei und noch besser in C-Level konvertieren.
Arthurprs
Der Listenkonstruktor ist eine elegante Funktion, die Zeichenfolgen automatisch in Zeichenarrays konvertiert. Da String eine homogene Folge von Unicode-Zeichen ist, ist es so cool, mit Python zu arbeiten, und der Schöpfer Guido hat es besser gemacht. Liebevolle Python für seine wunderbaren Fähigkeiten.
Doogle
Ich möchte, dass die Flagge hier dies nicht tut ... aber wenn Sie cast_method = lambda x: [x]
anrufbar
72

Sie nehmen den String und übergeben ihn an list ()

s = "mystring"
l = list(s)
print l
Senthil Kumaran
quelle
60

Sie können dies auch auf sehr einfache Weise ohne list () tun:

>>> [c for c in "foobar"]
['f', 'o', 'o', 'b', 'a', 'r']
Lewis James-Odwin
quelle
4
Willkommen beim Stackoverflow. Würde es Ihnen etwas ausmachen, die Antwort ein wenig zu erweitern, um zu erklären, wie das Problem gelöst wird?
NJInamdar
21
Dies ist nur for, es gibt nicht viel zu erklären. Ich denke, Sie sollten das Python-Tutorial zu Datenstrukturen lesen , insbesondere zum Listenverständnis.
WhyNotHugo
4
Dies bedeutet nur list(map(lambda c: c, iter("foobar"))), aber lesbarer und aussagekräftiger.
no1xsyzy
41

Wenn Sie Ihren String zeichenweise verarbeiten möchten. Sie haben verschiedene Möglichkeiten.

uhello = u'Hello\u0020World'

Listenverständnis verwenden:

print([x for x in uhello])

Ausgabe:

['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']

Karte verwenden:

print(list(map(lambda c2: c2, uhello)))

Ausgabe:

['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']

Aufruf Integrierte Listenfunktion:

print(list(uhello))

Ausgabe:

['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']

Verwenden der for-Schleife:

for c in uhello:
    print(c)

Ausgabe:

H
e
l
l
o

W
o
r
l
d
Sid
quelle
Gibt es Unterschiede in den Leistungsmerkmalen jeder dieser Methoden?
qxzsilver
20

Ich habe zwei weitere Möglichkeiten untersucht, um diese Aufgabe zu erfüllen. Es kann für jemanden hilfreich sein.

Der erste ist einfach:

In [25]: a = []
In [26]: s = 'foobar'
In [27]: a += s
In [28]: a
Out[28]: ['f', 'o', 'o', 'b', 'a', 'r']

Und der zweite Gebrauch mapund lambdaFunktion. Es kann für komplexere Aufgaben geeignet sein:

In [36]: s = 'foobar12'
In [37]: a = map(lambda c: c, s)
In [38]: a
Out[38]: ['f', 'o', 'o', 'b', 'a', 'r', '1', '2']

Zum Beispiel

# isdigit, isspace or another facilities such as regexp may be used
In [40]: a = map(lambda c: c if c.isalpha() else '', s)
In [41]: a
Out[41]: ['f', 'o', 'o', 'b', 'a', 'r', '', '']

Weitere Methoden finden Sie in den Python-Dokumenten

Alexey Milogradov
quelle
Der erste Weg ist sehr einfach. Gibt es Gründe, warum Menschen etwas Komplexeres wollen?
Undrline
Hallo! Die erste Option ist in der Tat einfach. Die zweite hat jedoch ein besseres Potenzial für die Handhabung komplexerer Verarbeitungen.
Alexey Milogradov
19

Die Aufgabe besteht darin, die Zeichen der Zeichenfolge zu durchlaufen und in einer Liste zu sammeln. Die naivste Lösung würde aussehen

result = []
for character in string:
    result.append(character)

Natürlich kann es auf nur verkürzt werden

result = [character for character in string]

Es gibt jedoch immer noch kürzere Lösungen, die dasselbe tun.

listDer Konstruktor kann verwendet werden, um alle iterierbaren Elemente (Iteratoren, Listen, Tupel, Zeichenfolgen usw.) in Listen umzuwandeln .

>>> list('abc')
['a', 'b', 'c']

Das große Plus ist, dass es sowohl in Python 2 als auch in Python 3 gleich funktioniert.

Ab Python 3.5 (dank des großartigen PEP 448 ) ist es jetzt auch möglich, eine Liste aus jedem iterierbaren Element zu erstellen, indem Sie sie in ein leeres Listenliteral entpacken:

>>> [*'abc']
['a', 'b', 'c']

Dies ist übersichtlicher und in einigen Fällen effizienter als der listdirekte Aufruf des Konstruktors.

Ich würde davon abraten , mit map-basierten Ansätzen, weil mapsich nicht um eine Liste in Python 3. Siehe zurückkehren Wie Verwendung Filter, Karte und reduzieren in Python 3 .

Vaultah
quelle
Ich finde den letzten Vorschlag sehr schön. Aber ich verstehe nicht, warum Sie einige der anderen Ansätze (die meisten von ihnen) bereits überarbeitet haben und hier von der erstaunlichen Python 3.5-Lösung ablenken !
MSeifert
13

Ich brauche nur eine Reihe von Zeichen:

arr = list(str)

Wenn Sie die Str durch eine bestimmte Str teilen möchten:

# str = "temp//temps" will will be ['temp', 'temps']
arr = str.split("//")
Safari
quelle
12

split()Die eingebaute Funktion trennt den Wert nur auf der Grundlage einer bestimmten Bedingung, kann jedoch in einem einzigen Wort die Bedingung nicht erfüllen. So kann es mit Hilfe von gelöst werden list(). Es ruft das Array intern auf und speichert den Wert auf der Basis eines Arrays.

Annehmen,

a = "bottle"
a.split() // will only return the word but not split the every single char.

a = "bottle"
list(a) // will separate ['b','o','t','t','l','e']
Anshul Singh Suryan
quelle
4

Pack sie aus:

word = "Paralelepipedo"
print([*word])
Enrique Bermúdez
quelle
3

Wenn Sie nur Lesezugriff auf die Zeichenfolge wünschen, können Sie die Array-Notation direkt verwenden.

Python 2.7.6 (default, Mar 22 2014, 22:59:38) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> t = 'my string'
>>> t[1]
'y'

Könnte zum Testen ohne Verwendung von regulärem Ausdruck nützlich sein. Enthält die Zeichenfolge eine abschließende neue Zeile?

>>> t[-1] == '\n'
False
>>> t = 'my string\n'
>>> t[-1] == '\n'
True
Sylvain
quelle
1

Nun, so sehr ich die Listenversion (en) mag, hier ist eine andere ausführlichere Art, die ich gefunden habe (aber es ist cool, also dachte ich, ich würde es dem Kampf hinzufügen):

>>> text = "My hovercraft is full of eels"
>>> [text[i] for i in range(len(text))]
['M', 'y', ' ', 'h', 'o', 'v', 'e', 'r', 'c', 'r', 'a', 'f', 't', ' ', 'i', 's', ' ', 'f', 'u', 'l', 'l', ' ', 'o', 'f', ' ', 'e', 'e', 'l', 's']
John Lockwood
quelle
camelcase = ''.join([text[i].upper() if i % 2 else text[i].lower() for i in range(len(text))])
whereisalext
1
from itertools import chain

string = 'your string'
chain(string)

Ähnlich, gibt list(string)jedoch einen Generator zurück, der am Verwendungsort träge ausgewertet wird, sodass der Speicher effizient ist.

Minggli
quelle
Ich bin mir nicht sicher, wo dies nützlicher wäre als die Zeichenfolge selbst, die iterierbar ist.
Ry-
0
>>> for i in range(len(a)):
...     print a[i]
... 

Dabei ist a die Zeichenfolge, die Sie trennen möchten. Die Werte "a [i]" sind das individuelle Zeichen der Zeichenfolge, die an eine Liste angehängt werden kann.

Abass Sesay
quelle
1
for c in a: print cist viel direkter
James Waldby - jwpat7