In C ++ kann ich Folgendes wiederholen std::string
:
std::string str = "Hello World!";
for (int i = 0; i < str.length(); ++i)
{
std::cout << str[i] << std::endl;
}
Wie iteriere ich in Python über einen String?
Wie Johannes betonte,
for c in "string":
#do something with c
Mit dem for loop
Konstrukt können Sie so ziemlich alles in Python iterieren.
Gibt beispielsweise open("file.txt")
ein Dateiobjekt zurück (und öffnet die Datei), wobei das Iterieren über die Zeilen in dieser Datei iteriert
with open(filename) as f:
for line in f:
# do something with line
Wenn das wie Magie erscheint, ist es das auch, aber die Idee dahinter ist wirklich einfach.
Es gibt ein einfaches Iteratorprotokoll, das auf jede Art von Objekt angewendet werden kann, um das zu erstellen for
Schleife daran arbeitet.
Implementieren Sie einfach einen Iterator, der eine next()
Methode definiert , und implementieren Sie eine __iter__
Methode für eine Klasse, um sie iterierbar zu machen. (das sollte __iter__
natürlich ein Iteratorobjekt zurückgeben, dh ein Objekt, das definiert next()
)
Wenn Sie beim Durchlaufen der Zeichenfolge Zugriff auf den Index benötigen, verwenden Sie
enumerate()
:quelle
1 t
,2 e
,3 s
,4 t
verwenden Sie den Parameter „Start“:for i, c in enumerate('test', start=1)
Sogar einfacher:
quelle
for c in "test": print (c)
Warum?Um eine umfassendere Antwort zu erhalten, kann die C-Methode zum Iterieren über einen String in Python angewendet werden, wenn Sie wirklich einen quadratischen Stift in ein rundes Loch zwingen möchten.
Aber warum tun Sie das, wenn Zeichenfolgen von Natur aus iterierbar sind?
quelle
for i in range(len(...))
ist böse Erstellt in Python 2.xrange()
eine Liste, sodass Sie für eine sehr lange Länge möglicherweise einen sehr großen Speicherblock zuweisen. Zumindestxrange()
in diesen Fällen verwenden. Außerdem ist die wiederholte Indizierung derselben Zeichenfolge viel langsamer als die direkte Iteration über die Zeichenfolge. Wenn Sie den Index benötigen, verwenden Sieenumerate()
.Nun, Sie können auch so etwas Interessantes machen und Ihre Arbeit mit der for-Schleife erledigen
Antwort ist
Herr . S uryaa
Da range () jedoch eine Liste der Werte erstellt, bei der es sich um eine Sequenz handelt, können Sie den Namen direkt verwenden
Dies führt auch zu demselben Ergebnis und sieht auch besser aus und funktioniert mit jeder Sequenz wie Liste, Tupel und Wörterbuch.
Wir haben zwei integrierte Funktionen (BIFs in Python Community) verwendet.
1) range () - range () BIF wird zum Erstellen von Indizes verwendet. Beispiel
2) len () - len () BIF wird verwendet, um die Länge einer bestimmten Zeichenfolge zu ermitteln
quelle
Wenn Sie einen funktionaleren Ansatz zum Durchlaufen einer Zeichenfolge verwenden möchten (möglicherweise, um sie irgendwie zu transformieren), können Sie die Zeichenfolge in Zeichen aufteilen, eine Funktion auf jede Zeichenfolge anwenden und die resultierende Liste der Zeichen wieder zu einer Zeichenfolge zusammenfügen.
Eine Zeichenfolge ist von Natur aus eine Liste von Zeichen. Daher durchläuft 'map' die Zeichenfolge - als zweites Argument - und wendet die Funktion - das erste Argument - auf jedes einzelne an.
Zum Beispiel verwende ich hier einen einfachen Lambda-Ansatz, da ich nur eine geringfügige Änderung des Zeichens vornehmen möchte: Hier, um jeden Zeichenwert zu erhöhen:
oder allgemeiner:
Dabei nimmt my_function einen Zeichenwert und gibt einen Zeichenwert zurück.
quelle
Hier werden mehrere Antworten verwendet
range
.xrange
ist im Allgemeinen besser, da ein Generator zurückgegeben wird, als eine vollständig instanziierte Liste. Wo Speicher und / oder Iterables unterschiedlichster Länge ein Problem sein können,xrange
ist überlegen.quelle
Wenn Sie jemals in einer Situation laufen, in der Sie es brauchen
get the next char of the word using __next__()
, denken Sie daran, ein zu erstellenstring_iterator
und darüber zu iterieren und nicht dasoriginal string (it does not have the __next__() method)
Wenn ich in diesem Beispiel ein Zeichen
[
finde]
, schaue ich weiter nach dem nächsten Wort, während ich es nicht finde. Daher muss ich __next__ verwendenHier würde eine for-Schleife über den String nicht helfen
quelle