Iterasi setiap karakter dalam string menggunakan Python

517

Di C ++, saya bisa mengulangi std::stringseperti ini:

std::string str = "Hello World!";

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

Bagaimana cara saya mengulangi string dengan Python?

Paradius
sumber

Jawaban:

441

Seperti yang ditunjukkan oleh Yohanes,

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

Anda dapat melakukan iterasi pada python menggunakan for loopkonstruk,

misalnya, open("file.txt")mengembalikan objek file (dan membuka file), iterate iterate iterates over lines dalam file itu

with open(filename) as f:
    for line in f:
        # do something with line

Jika itu tampak seperti sulap, ya memang begitu, tetapi ide di baliknya sangat sederhana.

Ada protokol iterator sederhana yang dapat diterapkan ke segala jenis objek untuk membuat forloop bekerja di sana.

Cukup menerapkan iterator yang mendefinisikan next()metode, dan mengimplementasikan __iter__metode pada kelas untuk membuatnya iterable. ( __iter__tentu saja, harus mengembalikan objek iterator, yaitu objek yang mendefinisikan next())

Lihat dokumentasi resmi

Hasen
sumber
14
Sebagai catatan, iterasi terbalik diarsipkan dengan: untuk c dalam terbalik ("string")
Akseli Palén
Dari bagian mana dari dokumentasi Anda tahu bahwa string adalah tipe iterator?
winklerrr
dir () sebuah string..anda dengan atribut iter see .
shadow0359
312

Jika Anda memerlukan akses ke indeks saat Anda mengulanginya melalui string, gunakan enumerate():

>>> for i, c in enumerate('test'):
...     print i, c
... 
0 t
1 e
2 s
3 t
moinudin
sumber
9
Pro tip: dimulai dari nol. Jika Anda perlu mulai dari satu: 1 t, 2 e, 3 s, 4 tmenggunakan parameter "start":for i, c in enumerate('test', start=1)
Messa
90

Lebih mudah lagi:

for c in "test":
    print c
Johannes Weiss
sumber
Saya seorang pemula di Python. Untuk beberapa alasan, ini tidak bisa dikompilasi di lingkungan saya, dan saya harus meletakkan tanda kurung c agar berfungsi: for c in "test": print (c) Mengapa?
Mauro Vanetti
7
@ MauroVanetti hampir pasti karena Anda menggunakan Python 3 dan ketika saya menjawab pertanyaan, hanya AFAIK Python 2.
Johannes Weiss
37

Hanya untuk membuat jawaban yang lebih komprehensif, cara C mengulangi string dapat diterapkan dengan Python, jika Anda benar-benar ingin memaksa pasak persegi ke dalam lubang bundar.

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

Tetapi sekali lagi, mengapa itu dilakukan ketika string secara inheren dapat diubah?

for i in str:
    print i
Andrew Szeto
sumber
6
Daripada loop sementara pertama Anda, Anda dapat melakukan: untuk i dalam jangkauan (len (str)): print (str [i]) Yang menurut saya lebih baik daripada harus mengelola counter sendiri. Yang lebih baik adalah jawaban marcog menggunakan enumerate.
aiham
1
Ini mungkin didasarkan pada penggunaan C yang sudah begitu lama, tapi saya hampir selalu menggunakan metode C-ish ini. Misalnya, saya memiliki file dengan beberapa angka 4 digit yang bertebaran, semuanya dimulai dengan 0. Jadi saya perlu mencari "0" dan ambil itu dan 3 karakter berikutnya, dan lanjutkan tanpa menduplikasi nomor jika ada 0 lainnya mengikutinya. Tak satu pun dari metode "for c in str" atau "for i, c in enumerate (str)" bekerja karena saya memerlukan kendali indeks. Saya yakin ekspresi reguler akan jauh lebih baik.
gkimsey
1
for i in range(len(...))itu jahat. Dalam python 2.x, range()membuat daftar, jadi untuk waktu yang sangat lama Anda mungkin akhirnya mengalokasikan blok memori yang sangat besar. Paling tidak gunakan xrange()dalam kasus-kasus itu. Juga, pengindeksan berulang pada string yang sama jauh lebih lambat daripada iterasi langsung di atas string. Jika Anda membutuhkan indeks, gunakan enumerate().
izak
6

Anda juga dapat melakukan sesuatu yang menarik seperti ini dan melakukan pekerjaan Anda dengan menggunakan for loop

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

Jawabannya adalah

Pak . S uryaa

Namun karena rentang () buat daftar nilai yang berurutan sehingga Anda dapat langsung menggunakan namanya

for e in name:
    print(e)

Ini juga menghasilkan hasil yang sama dan juga terlihat lebih baik dan berfungsi dengan urutan seperti daftar, tupel, dan kamus.

Kami telah menggunakan fungsi Built in Built (BIFs in Python Community)

1) range () - range () BIF digunakan untuk membuat indeks Contoh

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

2) len () - len () BIF digunakan untuk mengetahui panjang string yang diberikan

Pak Suryaa Jha
sumber
4

Jika Anda ingin menggunakan pendekatan yang lebih fungsional untuk mengulangi string (mungkin untuk mengubahnya entah bagaimana), Anda dapat membagi string menjadi karakter, menerapkan fungsi untuk masing-masing, kemudian bergabung dengan daftar karakter yang dihasilkan kembali ke dalam string.

Sebuah string pada dasarnya adalah daftar karakter, maka 'peta' akan beralih di atas string - sebagai argumen kedua - menerapkan fungsi - argumen pertama - untuk masing-masing karakter.

Misalnya, di sini saya menggunakan pendekatan lambda sederhana karena semua yang ingin saya lakukan adalah modifikasi sepele untuk karakter: di sini, untuk menambah setiap nilai karakter:

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

atau lebih umum:

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

di mana my_function mengambil nilai char dan mengembalikan nilai char.

MikeW
sumber
2

Beberapa jawaban di sini digunakan range. xrangeumumnya lebih baik karena mengembalikan generator, daripada daftar yang sepenuhnya instantiated. Di mana memori dan atau iterables dari berbagai panjang dapat menjadi masalah, xrangelebih unggul.

N6151H
sumber
1
perhatikan bahwa ini hanya berlaku untuk Python 2 yang diharapkan menjadi minoritas yang menyusut sekarang
Sam Mason
0

Jika Anda pernah berlari dalam situasi di mana Anda perlu get the next char of the word using __next__(), ingatlah untuk membuat string_iteratordan mengulanginya dan bukanoriginal string (it does not have the __next__() method)

Dalam contoh ini, ketika saya menemukan char = [saya terus mencari kata berikutnya sementara saya tidak menemukan ], jadi saya perlu menggunakan __next__

di sini untuk loop atas string tidak akan membantu

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
Bernardo stearns Reisen
sumber