ใน C ++ ฉันสามารถทำซ้ำสิ่งstd::string
นี้ได้:
std::string str = "Hello World!";
for (int i = 0; i < str.length(); ++i)
{
std::cout << str[i] << std::endl;
}
ฉันจะวนซ้ำสตริงใน Python อย่างไร
ใน C ++ ฉันสามารถทำซ้ำสิ่งstd::string
นี้ได้:
std::string str = "Hello World!";
for (int i = 0; i < str.length(); ++i)
{
std::cout << str[i] << std::endl;
}
ฉันจะวนซ้ำสตริงใน Python อย่างไร
คำตอบ:
โยฮันเนสชี้ให้เห็น
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()
)
หากคุณต้องการเข้าถึงดัชนีในขณะที่คุณวนซ้ำสตริงให้ใช้enumerate()
:
>>> for i, c in enumerate('test'):
... print i, c
...
0 t
1 e
2 s
3 t
1 t
, 2 e
, 3 s
, 4 t
ใช้พารามิเตอร์ "เริ่มต้น":for i, c in enumerate('test', start=1)
ง่ายยิ่งขึ้น:
for c in "test":
print c
for c in "test": print (c)
ทำไม?
เพียงเพื่อให้ได้คำตอบที่ครอบคลุมมากขึ้นวิธีการวนซ้ำของสตริงสามารถใช้ใน Python ได้หากคุณต้องการบังคับให้หมุดสี่เหลี่ยมจัตุรัสเป็นรูกลมจริงๆ
i = 0
while i < len(str):
print str[i]
i += 1
แต่แล้วอีกครั้งทำไมทำอย่างนั้นเมื่อสตริงมีซ้ำ iterable โดยเนื้อแท้?
for i in str:
print i
for i in range(len(...))
คือความชั่วร้าย ใน python 2.x range()
สร้างรายการดังนั้นสำหรับความยาวที่ยาวมากคุณอาจจะต้องจัดสรรหน่วยความจำที่มีขนาดใหญ่มาก อย่างน้อยที่สุดก็ใช้xrange()
ในกรณีเหล่านั้น นอกจากนี้การจัดทำดัชนีของสตริงเดียวกันซ้ำช้ากว่าการทำซ้ำมากกว่าสตริงโดยตรง enumerate()
หากคุณต้องการดัชนีการใช้งาน
ทีนี้คุณสามารถทำสิ่งที่น่าสนใจเช่นนี้และทำงานของคุณด้วยการวนซ้ำ
#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 ใช้เพื่อหาความยาวของสตริงที่กำหนด
หากคุณต้องการใช้วิธีการทำงานที่มากขึ้นในการวนซ้ำสตริง (อาจแปลงเป็นอย่างใด) คุณสามารถแบ่งสตริงเป็นอักขระใช้ฟังก์ชันกับแต่ละอันจากนั้นเข้าร่วมรายการผลลัพธ์ของอักขระกลับไปเป็นสตริง
สตริงคือรายการของอักขระโดยเนื้อแท้แล้ว 'map' จะวนซ้ำสตริง - เป็นอาร์กิวเมนต์ที่สอง - การใช้ฟังก์ชัน - อาร์กิวเมนต์แรก - กับแต่ละตัว
ตัวอย่างเช่นที่นี่ฉันใช้แลมบ์ดาแบบง่าย ๆ เพราะสิ่งที่ฉันต้องการจะทำคือการดัดแปลงตัวละครเล็กน้อย: ที่นี่เพื่อเพิ่มมูลค่าของตัวละครแต่ละตัว:
>>> ''.join(map(lambda x: chr(ord(x)+1), "HAL"))
'IBM'
หรือโดยทั่วไป:
>>> ''.join(map(my_function, my_string))
โดยที่ my_function รับค่าถ่านและส่งกลับค่าถ่าน
range
หลายคำตอบที่นี่ใช้ xrange
โดยทั่วไปจะดีกว่าเนื่องจากส่งคืนตัวกำเนิดแทนที่จะเป็นรายการที่สร้างอินสแตนซ์สมบูรณ์ ที่หน่วยความจำและหรือ iterables ความยาวแตกต่างกันอย่างกว้างขวางสามารถเป็นปัญหาxrange
ได้ดีกว่า
หากคุณเคยทำงานในสถานการณ์ที่คุณต้องการ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