Iterieren jedes Zeichens in einer Zeichenfolge mit Python


517

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?

Antworten:


441

Wie Johannes betonte,

for c in "string":
    #do something with c

Mit dem for loopKonstrukt 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())

Siehe offizielle Dokumentation


14
Als Hinweis wird die umgekehrte Iteration archiviert mit: für c in umgekehrter
Reihenfolge

Aus welchem ​​Teil der Dokumentation wissen Sie, dass eine Zeichenfolge ein Iteratortyp ist?
Winklerrr

dir () a string..you with see iter attribute.
shadow0359

312

Wenn Sie beim Durchlaufen der Zeichenfolge Zugriff auf den Index benötigen, verwenden Sie enumerate():

>>> for i, c in enumerate('test'):
...     print i, c
... 
0 t
1 e
2 s
3 t

9
Profi-Tipp: Es beginnt bei Null. Wenn Sie es von einer beginnen müssen: 1 t, 2 e, 3 s, 4 tverwenden Sie den Parameter „Start“:for i, c in enumerate('test', start=1)
Messa

90

Sogar einfacher:

for c in "test":
    print c

Ich bin ein Neuling in Python. Aus irgendeinem Grund wird dies in meiner Umgebung nicht kompiliert, und ich musste c in Klammern setzen, damit es funktioniert: for c in "test": print (c) Warum?
Mauro Vanetti

7
@ MauroVanetti das ist mit ziemlicher Sicherheit, weil Sie Python 3 verwenden und als ich die Frage beantwortete, gab es AFAIK nur Python 2.
Johannes Weiss

37

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.

i = 0
while i < len(str):
    print str[i]
    i += 1

Aber warum tun Sie das, wenn Zeichenfolgen von Natur aus iterierbar sind?

for i in str:
    print i

6
Anstelle Ihrer ersten while-Schleife können Sie Folgendes tun: für i in range (len (str)): print (str [i]) Was meiner Meinung nach besser ist, als den Zähler selbst verwalten zu müssen. Noch besser ist die Antwort von marcog mit enumerate.
Aiham

1
Dies mag darauf beruhen, dass ich C nur so lange verwendet habe, aber am Ende verwende ich fast immer diese C-ish-Methode. Zum Beispiel habe ich eine Datei mit einigen 4-stelligen Zahlen, die alle mit 0 beginnen. Also muss ich eine "0" finden und sie und die nächsten 3 Zeichen greifen und weitermachen, ohne die Zahl zu duplizieren, wenn es welche gibt eine weitere 0 folgt. Keine der Methoden "for c in str" oder "for i, c in enumerate (str)" funktioniert, da ich die Kontrolle über den Index benötige. Ich bin mir jedoch sicher, dass ein regulärer Ausdruck viel besser wäre.
Gkimsey

1
for i in range(len(...))ist böse Erstellt in Python 2.x range()eine Liste, sodass Sie für eine sehr lange Länge möglicherweise einen sehr großen Speicherblock zuweisen. Zumindest xrange()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 Sie enumerate().
Izak

6

Nun, Sie können auch so etwas Interessantes machen und Ihre Arbeit mit der for-Schleife erledigen

#suppose you have variable name
name = "Mr.Suryaa"
for index in range ( len ( name ) ):
    print ( name[index] ) #just like c and c++ 

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

for e in name:
    print(e)

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

for i in range ( 5 ) :
can produce 0 , 1 , 2 , 3 , 4

2) len () - len () BIF wird verwendet, um die Länge einer bestimmten Zeichenfolge zu ermitteln


4

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:

>>> ''.join(map(lambda x: chr(ord(x)+1), "HAL"))
'IBM'

oder allgemeiner:

>>> ''.join(map(my_function, my_string))

Dabei nimmt my_function einen Zeichenwert und gibt einen Zeichenwert zurück.


2

Hier werden mehrere Antworten verwendet range. xrangeist 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, xrangeist überlegen.


1
Beachten Sie, dass dies nur für Python 2 gilt, das hoffentlich jetzt eine schrumpfende Minderheit ist
Sam Mason,

0

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 erstellen string_iteratorund 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__ verwenden

Hier würde eine for-Schleife über den String nicht helfen

myString = "'string' 4 '['RP0', 'LC0']' '[3, 4]' '[3, '4']'"
processedInput = ""
word_iterator = myString.__iter__()
for idx, char in enumerate(word_iterator):
    if char == "'":
        continue

    processedInput+=char

    if char == '[':
        next_char=word_iterator.__next__()
        while(next_char != "]"):
          processedInput+=next_char
          next_char=word_iterator.__next__()
        else:
          processedInput+=next_char
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.