วนซ้ำอักขระแต่ละตัวในสตริงโดยใช้ Python


517

ใน C ++ ฉันสามารถทำซ้ำสิ่งstd::stringนี้ได้:

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

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

ฉันจะวนซ้ำสตริงใน Python อย่างไร

คำตอบ:


441

โยฮันเนสชี้ให้เห็น

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

คุณสามารถทำซ้ำอะไรก็ได้ในงูใหญ่โดยใช้for loopโครงสร้าง

ตัวอย่างเช่นopen("file.txt")ส่งคืนออบเจคต์ไฟล์ (และเปิดไฟล์) โดยวนซ้ำโดยทำซ้ำผ่านบรรทัดในไฟล์นั้น

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

ถ้ามันดูเหมือนเวทมนตร์มันก็เป็นเช่นนั้น แต่ความคิดเบื้องหลังมันง่ายมาก

มีโปรโตคอลตัววนซ้ำแบบง่ายที่สามารถนำไปใช้กับวัตถุชนิดใดก็ได้เพื่อให้การforวนซ้ำทำงานได้

เพียงใช้ iterator ที่กำหนดnext()วิธีการและใช้__iter__วิธีการในชั้นเรียนเพื่อให้ iterable ( __iter__แน่นอนควรส่งคืนวัตถุตัววนซ้ำนั่นคือวัตถุที่กำหนดnext())

ดูเอกสารอย่างเป็นทางการ


14
โปรดทราบว่าการวนซ้ำแบบย้อนกลับถูกเก็บถาวรด้วย: สำหรับ c ในการย้อนกลับ ("สตริง")
Akseli Palén

คุณรู้จากส่วนใดของเอกสารว่าสตริงเป็นชนิดตัววนซ้ำ?
winklerrr

dir () สตริง .. คุณเห็นแอ ททริบิวiter
shadow0359

312

หากคุณต้องการเข้าถึงดัชนีในขณะที่คุณวนซ้ำสตริงให้ใช้enumerate():

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

9
เคล็ดลับสำหรับมืออาชีพ: เริ่มต้นจากศูนย์ หากคุณต้องการที่จะเริ่มต้นจากที่หนึ่ง: 1 t, 2 e, 3 s, 4 tใช้พารามิเตอร์ "เริ่มต้น":for i, c in enumerate('test', start=1)
Messa

90

ง่ายยิ่งขึ้น:

for c in "test":
    print c

ฉันเป็นมือใหม่ใน Python ด้วยเหตุผลบางอย่างสิ่งนี้ไม่ได้รวบรวมในสภาพแวดล้อมของฉันและฉันต้องใส่ c ในวงเล็บเพื่อให้มันทำงาน: for c in "test": print (c) ทำไม?
Mauro Vanetti

7
@MauroVanetti นั้นเกือบจะแน่นอนเพราะคุณใช้ Python 3 และเมื่อฉันตอบคำถามมี AFAIK เพียง Python 2
Johannes Weiss

37

เพียงเพื่อให้ได้คำตอบที่ครอบคลุมมากขึ้นวิธีการวนซ้ำของสตริงสามารถใช้ใน Python ได้หากคุณต้องการบังคับให้หมุดสี่เหลี่ยมจัตุรัสเป็นรูกลมจริงๆ

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

แต่แล้วอีกครั้งทำไมทำอย่างนั้นเมื่อสตริงมีซ้ำ iterable โดยเนื้อแท้?

for i in str:
    print i

6
แทนที่จะเป็นลูปแรกของคุณคุณสามารถทำได้: สำหรับ i ในช่วง (len (str)): print (str [i]) ซึ่งในความคิดของฉันดีกว่าต้องจัดการเคาน์เตอร์ด้วยตัวเอง ดียิ่งขึ้นคือคำตอบของ Marcog โดยใช้แจง
aiham

1
สิ่งนี้อาจขึ้นอยู่กับการใช้งาน C มานาน แต่ฉันมักจะจบลงด้วยการใช้วิธี C-ish นี้ ตัวอย่างเช่นฉันมีไฟล์ที่มีตัวเลข 4 หลักกระจายอยู่ซึ่งทั้งหมดเริ่มต้นด้วย 0 ดังนั้นฉันจึงต้องค้นหา "0" และคว้ามันและตัวละคร 3 ตัวถัดไปและดำเนินการต่อโดยไม่ทำซ้ำหมายเลขหากมี อีก 0 ติดตาม ไม่มีวิธี "สำหรับ c ใน str" หรือ "สำหรับ i, c ใน enumerate (str)" วิธีการทำงานเพราะฉันต้องการการควบคุมของดัชนี ฉันแน่ใจว่าการแสดงออกปกติจะดีกว่ามาก
gkimsey

1
for i in range(len(...))คือความชั่วร้าย ใน python 2.x range()สร้างรายการดังนั้นสำหรับความยาวที่ยาวมากคุณอาจจะต้องจัดสรรหน่วยความจำที่มีขนาดใหญ่มาก อย่างน้อยที่สุดก็ใช้xrange()ในกรณีเหล่านั้น นอกจากนี้การจัดทำดัชนีของสตริงเดียวกันซ้ำช้ากว่าการทำซ้ำมากกว่าสตริงโดยตรง enumerate()หากคุณต้องการดัชนีการใช้งาน
izak

6

ทีนี้คุณสามารถทำสิ่งที่น่าสนใจเช่นนี้และทำงานของคุณด้วยการวนซ้ำ

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

คำตอบคือ

นาย . S uryaa

อย่างไรก็ตามเนื่องจาก range () สร้างรายการค่าที่เป็นลำดับจึงทำให้คุณสามารถใช้ชื่อได้โดยตรง

for e in name:
    print(e)

สิ่งนี้ยังสร้างผลลัพธ์เดียวกันและดูดีขึ้นและทำงานกับลำดับใด ๆ เช่นรายการ tuple และพจนานุกรม

เราได้ใช้ฟังก์ชันพ่วงในตัว (BIF ในชุมชน Python)

1) range () - range () BIF ใช้เพื่อสร้างดัชนีตัวอย่าง

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

2) len () - len () BIF ใช้เพื่อหาความยาวของสตริงที่กำหนด


4

หากคุณต้องการใช้วิธีการทำงานที่มากขึ้นในการวนซ้ำสตริง (อาจแปลงเป็นอย่างใด) คุณสามารถแบ่งสตริงเป็นอักขระใช้ฟังก์ชันกับแต่ละอันจากนั้นเข้าร่วมรายการผลลัพธ์ของอักขระกลับไปเป็นสตริง

สตริงคือรายการของอักขระโดยเนื้อแท้แล้ว 'map' จะวนซ้ำสตริง - เป็นอาร์กิวเมนต์ที่สอง - การใช้ฟังก์ชัน - อาร์กิวเมนต์แรก - กับแต่ละตัว

ตัวอย่างเช่นที่นี่ฉันใช้แลมบ์ดาแบบง่าย ๆ เพราะสิ่งที่ฉันต้องการจะทำคือการดัดแปลงตัวละครเล็กน้อย: ที่นี่เพื่อเพิ่มมูลค่าของตัวละครแต่ละตัว:

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

หรือโดยทั่วไป:

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

โดยที่ my_function รับค่าถ่านและส่งกลับค่าถ่าน


2

rangeหลายคำตอบที่นี่ใช้ xrangeโดยทั่วไปจะดีกว่าเนื่องจากส่งคืนตัวกำเนิดแทนที่จะเป็นรายการที่สร้างอินสแตนซ์สมบูรณ์ ที่หน่วยความจำและหรือ iterables ความยาวแตกต่างกันอย่างกว้างขวางสามารถเป็นปัญหาxrangeได้ดีกว่า


1
โปรดทราบว่าสิ่งนี้ใช้ได้กับ Python 2 เท่านั้นซึ่งหวังว่าจะเป็นชนกลุ่มน้อยที่ลดขนาดลงในตอนนี้
Sam Mason

0

หากคุณเคยทำงานในสถานการณ์ที่คุณต้องการget the next char of the word using __next__()อย่าลืมสร้างstring_iteratorและทำซ้ำมันและไม่ใช่original string (it does not have the __next__() method)

ในตัวอย่างนี้เมื่อฉันพบถ่าน = [ฉันยังคงมองหาคำต่อไปในขณะที่ฉันไม่พบ]ดังนั้นฉันต้องใช้ __ ถัดไป _

นี่สำหรับการวนรอบสตริงจะไม่ช่วย

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.