Bir dizedeki her karakteri Python kullanarak yineleme


517

C ++, std::stringböyle bir yineleme yapabilirsiniz :

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

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

Python'da bir dize üzerinden nasıl yineleyebilirim?

Yanıtlar:


441

Johannes'in işaret ettiği gibi,

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

Yapıyı kullanarak python'da hemen hemen her şeyi tekrarlayabilirsiniz for loop,

örneğin, open("file.txt")bir dosya nesnesini döndürür (ve dosyayı açar), bunun üzerinden yineleyerek o dosyadaki satırlar üzerinden yinelenir

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

Eğer bu sihir gibi gözüküyorsa, öyle, ama arkasındaki fikir gerçekten basit.

forDöngünün üzerinde çalışması için her türlü nesneye uygulanabilen basit bir yineleyici protokolü vardır .

Sadece bir next()yöntemi tanımlayan bir yineleyici uygulayın __iter__ve bir sınıfı bir yöntemi tekrarlanabilir hale getirmek için uygulayın. ( __iter__elbette, bir yineleyici nesnesini, yani tanımlayan bir nesneyi döndürmelidir next())

Resmi belgelere bakın


14
Not olarak, ters yineleme şu şekilde arşivlenir: for c in
reversed

Bir dizenin yineleyici türü olduğunu belgelerin hangi bölümünden biliyorsunuz?
winklerrr

dir () bir string..you ile iter niteliğini görürsünüz .
shadow0359

312

Dize üzerinden yineleme yaparken dizine erişmeniz gerekiyorsa şunu kullanın enumerate():

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

9
Pro ipucu: sıfırdan başlar. Eğer birinden bunu başlatmak gerekirse: 1 t, 2 e, 3 s, 4 tparametresini kullanın "start":for i, c in enumerate('test', start=1)
Messa

90

Daha da kolay:

for c in "test":
    print c

Ben Python'da bir acemi. Bazı nedenlerden dolayı, bu ortamımda derlenmiyor ve c'yi çalışmak için parantez içine almak zorunda kaldım: for c in "test": print (c) Neden?
Mauro Vanetti

7
@MauroVanetti neredeyse kesinlikle Python 3 kullandığınız için ve soruyu cevapladığımda sadece AFAIK vardı Python 2
Johannes Weiss

37

Sadece daha kapsamlı bir cevap vermek için, bir kare pimi yuvarlak bir deliğe zorlamak istiyorsanız, bir dize üzerinde yineleme C yolu Python'da uygulanabilir.

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

Ama sonra tekrar, neden dizeler doğal olarak yinelenebilir olduğunda?

for i in str:
    print i

6
İlk while döngüsü yerine şunları yapabilirsiniz: for i aralığında (len (str)): print (str [i]) Bence sayacı kendi başınıza yönetmekten daha iyidir. Daha da iyisi marcog'un numaralandırma kullanarak cevabı.
aiham

1
Bu sadece C'yi çok uzun süre kullanmaya dayanabilir, ama neredeyse her zaman bu C-ish yöntemini kullanıyorum. Örneğin, hepsi 0 ile başlayan bazı 4 basamaklı sayılarla dolu bir dosyam var. Bu yüzden bir "0" bulup onu ve sonraki 3 karakteri yakalamam ve eğer numarayı çoğaltmadan devam etmeliyim başka bir 0 takip. "C için str" veya "i, enumerate (str)" yöntemleri için hiçbiri, çünkü dizin denetimi gerekiyor. Eminim düzenli bir ifade çok daha iyi olur.
gkimsey

1
for i in range(len(...))şeytan. Python 2.x'de range()bir liste oluşturur, böylece çok uzun bir süre için çok büyük bir bellek bloğu tahsis edebilirsiniz. En azından xrange()bu durumlarda kullanın . Ayrıca, aynı dizenin tekrarlanan dizine eklenmesi, doğrudan dizenin yinelenmesinden çok daha yavaştır. Dizine ihtiyacınız varsa kullanın enumerate().
izak

6

Ayrıca böyle ilginç bir şey yapabilir ve döngü için kullanarak işinizi yapabilirsiniz

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

Cevap:

Bay . S uryaa

Ancak range () değeri sıra olan değerlerin bir listesini oluşturduğundan, adı doğrudan kullanabilirsiniz.

for e in name:
    print(e)

Bu aynı sonucu verir ve daha iyi görünür ve liste, grup ve sözlük gibi herhangi bir sekansla çalışır.

Yedekte Yerleşik İşlevleri (Python Topluluğu'ndaki BIF'ler) kullandık

1) range () - range () BIF, dizin oluşturmak için kullanılır Örnek

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

2) len () - len () BIF, verilen dizenin uzunluğunu bulmak için kullanılır


4

Bir dize üzerinde yineleme yapmak için daha işlevsel bir yaklaşım kullanmak isterseniz (belki de bir şekilde dönüştürmek için), dizeyi karakterlere bölebilir, her birine bir işlev uygulayabilir ve sonuçta ortaya çıkan karakter listesini bir dizeye geri ekleyebilirsiniz.

Bir dize doğası gereği bir karakter listesidir, bu nedenle 'harita' dizginin üzerinde yinelenir - ikinci argüman olarak - işlevi uygulayarak - ilk argüman - her birine.

Örneğin, burada yapmak istediğim tek şey karakterde önemsiz bir değişiklik olduğu için basit bir lambda yaklaşımı kullanıyorum: burada, her karakter değerini artırmak için:

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

veya daha genel olarak:

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

burada my_function karakter değerini alır ve karakter değerini döndürür.


2

Burada birkaç cevap kullanılmaktadır range. xrangegenellikle tam bir liste yerine bir jeneratör döndürdüğü için daha iyidir. Bellek ve / veya çok çeşitli uzunluklarda yinelenebilirlerin sorun olabileceği durumlarda xrangeüstündür.


1
Bunun sadece umarım daralan bir azınlık olan Python 2 için geçerli olduğunu unutmayın
Sam Mason

0

İhtiyacınız olan bir durumda koşarsanız, bunun üzerinde get the next char of the word using __next__()bir string_iteratorve tekrar etmeyi unutmayın.original string (it does not have the __next__() method)

Bu örnekte, bir char = [bulduğumda , bulamadığımda bir sonraki kelimeye bakmaya devam ]ettiğim için __next__ kullanmam gerekiyor

burada dize üzerinde bir for döngüsü yardımcı olmaz

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.