2009-02-11 30 views
386

In C++, könnte ich tun:Iterieren über einen String

for (int i = 0; i < str.length(); ++i) 
    std::cout << str[i] << std::endl; 

Wie kann ich über eine Zeichenfolge in Python durchlaufen?

+71

Warum der Downvote, isnt "Wie wiederhole ich eine Zeichenfolge in Python?" eine vollkommen gute Programmierfrage? – Jonas

+144

Stackoverflow ist nicht ausschließlich für fortgeschrittene Fragen gedacht. Upvoted. –

+12

Ich stimme Upchurch zu. Ich habe mir Python mit verschiedenen Web-Tutorials beigebracht und wusste nicht, dass Sie das tun könnten. Upvoted. – mtruesdell

Antwort

309

Wie Johannes darauf hingewiesen,

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

Sie können so ziemlich alles in Python durchlaufen die for loop Konstrukt,

zum Beispiel open("file.txt") gibt eine Datei Objekt (und öffnet die Datei), iteriert über es iteriert über Zeilen in dieser Datei

Wenn das wie Magie scheint, ist es gut, aber die Idee dahinter ist wirklich einfach.

Es gibt ein einfaches Iterator-Protokoll, das auf alle Arten von Objekten angewendet werden kann, damit die 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. (Die __iter__ natürlich sollte ein Iterator-Objekt zurück, das heißt, ein Objekt, das next() definiert)

See official documentation

+9

Als eine Anmerkung, umgekehrte Iteration wird archiviert mit: für c in umgekehrt ("Zeichenfolge") –

+0

Aus welchem ​​Teil der Dokumentation wissen Sie, dass eine Zeichenfolge ein Iterator-Typ ist? – winklerrr

+0

dir() ein String..Sie mit siehe __iter__ Attribut. – shadow0359

80

Noch einfacher:

for c in "test": 
    print c 
+10

Nach einer Weile der Python-ing bin ich wirklich hassen C++ (Ich bin dran für einen aktuellen Universitätskurs!) – hasen

+1

Smart-und-auf-die-Punkt-Antwort. :) – zgoda

+0

Ich bin ein Neuling in Python. Aus irgendeinem Grund kompiliert dies nicht in meiner Umgebung, und ich musste c in Klammern setzen, damit es funktioniert: 'für c in" test ": drucken (c)' Warum? –

33

Nur um eine umfassende Antwort, die C Art und Weise über eine Reihe von iterieren kann in Python anwenden , wenn du einen quadratischen Pflock wirklich in ein rundes Loch zwingen willst.

Aber dann, warum, wenn Strings inhärent iterierbar sind?

for i in str: 
    print i 
+3

Upvoted dies, weil ich wissen musste, wie man auf das i-te Zeichen zugreift (ich bin an Java/C-Stil-String-Iterationen gewöhnt). –

+6

Statt ersten while-Schleife, können Sie tun: for i in range (len (str)): print (str [i]) die meiner Meinung nach besser als auf eigene Faust den Zähler zu verwalten, die . Noch besser ist Marcogs Antwort mit Enumerate. – aiham

+1

Das mag darauf beruhen, dass ich C so lange benutzt habe, aber ich benutze diese C-ish-Methode fast immer.Zum Beispiel habe ich eine Datei mit einigen 4-stelligen Zahlen verstreut, die alle mit 0 beginnen. Also muss ich eine "0" finden und sie und die nächsten 3 Zeichen ergreifen und weitergehen, ohne die Nummer zu duplizieren, wenn es welche gibt eine weitere 0 folgt ihm. Keine der Methoden "für c in str" oder "für i, c in enumerate (str)" funktioniert, weil ich die Kontrolle über den Index benötige. Ich bin mir sicher, dass ein regulärer Ausdruck viel besser wäre. – gkimsey

240

Wenn Sie den Zugriff auf den Index benötigen, wie Sie durch den String iterieren, verwenden enumerate():

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

+1 für die Indexoption – dopplesoldner

+1

thanx. das Erhalten des Indexes war die Sache, die ich suchte –

+3

Profi-Tipp: Es beginnt bei Null. Wenn Sie es von einem starten müssen: '1 t',' 2 e', '3 s',' 4 t' benutzen Sie den Parameter "start": 'für i, c in enumerate ('test', start = 1) ' – Messa

2

Wenn Sie einen funktionalen Ansatz verwenden möchten einen String (vielleicht iterieren zu verwandeln es irgendwie), können Sie die Zeichenkette in Zeichen aufteilen, wenden Sie eine Funktion auf jedes an und verbinden Sie dann die resultierende Liste der Zeichen zurück in eine Zeichenkette.

Eine Zeichenkette ist inhärent eine Liste von Zeichen, daher wird 'map' über die Zeichenkette - als zweites Argument - die Funktion - das erste Argument - anwenden.

Zum Beispiel, hier verwende ich einen einfachen Lambda-Ansatz, da alles, was ich tun möchte, eine triviale Änderung den Charakter ist: hier, jedes Zeichen Wert 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 char-Wert an und gibt einen char-Wert zurück.

2

Nun, Sie auch etwas Interessantes wie dies tun können und Ihre Arbeit tun, indem for-Schleife

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

Antwort ist

M r. S uryaa

jedoch seit range() eine Liste der Werte schaffen, die Sequenz so ist, dass Sie direkt den Namen

for e in name: 
    print(e) 

Dies erzeugt auch das gleiche Ergebnis und auch besser aussieht und funktioniert mit jeder beliebigen Reihenfolge verwenden können, wie Liste, Tupel und Wörterbuch.

Wir Schlepptau in Funktionen (BIF in Python Gemeinschaft) Errichtet verwendet haben

1) range() - Bereich() BIF wird verwendet, Indizes zu erstellen Beispiel

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

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

1

Mehrere Antworten hier verwenden range. xrange ist im Allgemeinen besser, da es einen Generator zurückgibt, anstatt eine vollständig instanziierte Liste. Wenn Speicher und/oder Iterables mit stark variierenden Längen ein Problem darstellen können, ist xrange überlegen.