Lặp lại từng ký tự trong một chuỗi bằng Python


517

Trong C ++, tôi có thể lặp lại std::stringnhư thế này:

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

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

Làm cách nào để lặp lại một chuỗi trong Python?

Câu trả lời:


441

Như Julian đã chỉ ra,

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

Bạn có thể lặp lại khá nhiều thứ trong python bằng cách sử dụng for loopcấu trúc,

ví dụ, open("file.txt")trả về một đối tượng tệp (và mở tệp), lặp lại qua nó lặp lại qua các dòng trong tệp đó

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

Nếu điều đó có vẻ giống như phép thuật, thì cũng tốt, nhưng ý tưởng đằng sau nó thực sự đơn giản.

Có một giao thức lặp đơn giản có thể được áp dụng cho bất kỳ loại đối tượng nào để làm cho forvòng lặp hoạt động trên nó.

Đơn giản chỉ cần thực hiện một trình vòng lặp xác định một next()phương thức và thực hiện một __iter__phương thức trên một lớp để làm cho nó có thể lặp lại được. ( __iter__tất nhiên, sẽ trả về một đối tượng iterator, nghĩa là một đối tượng xác định next())

Xem tài liệu chính thức


14
Lưu ý, phép lặp đảo ngược được lưu trữ với: for c in
Reverse

Từ phần nào của tài liệu bạn có biết rằng một chuỗi là một kiểu lặp không?
winklerrr

dir () một chuỗi..bạn có thể xem thuộc tính iter .
bóng0359

312

Nếu bạn cần truy cập vào chỉ mục khi bạn lặp qua chuỗi, hãy sử dụng enumerate():

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

9
Pro tip: nó bắt đầu từ số không. Nếu bạn cần phải bắt đầu nó từ một: 1 t, 2 e, 3 s, 4 tsử dụng tham số "bắt đầu":for i, c in enumerate('test', start=1)
Messa

90

Thậm chí dễ dàng hơn:

for c in "test":
    print c

Tôi là người mới chơi Python. Vì một số lý do, điều này không biên dịch trong môi trường của tôi và tôi đã phải đặt c vào ngoặc để làm cho nó hoạt động: for c in "test": print (c) Tại sao?
Mauro Vanetti

7
@MauroVanetti điều đó gần như chắc chắn bởi vì bạn đang sử dụng Python 3 và khi tôi trả lời câu hỏi thì chỉ có AFAIK Python 2.
Julian Weiss

37

Chỉ cần đưa ra một câu trả lời toàn diện hơn, cách lặp C trên một chuỗi có thể áp dụng trong Python, nếu bạn thực sự muốn buộc một chốt vuông vào một lỗ tròn.

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

Nhưng một lần nữa, tại sao lại làm như vậy khi các chuỗi vốn đã lặp lại?

for i in str:
    print i

6
Thay vì vòng lặp while đầu tiên của bạn, bạn có thể thực hiện: for i trong phạm vi (len (str)): print (str [i]) Theo ý kiến ​​của tôi tốt hơn là bạn phải tự mình quản lý bộ đếm. Thậm chí tốt hơn là câu trả lời của marcog bằng cách sử dụng liệt kê.
aiham

1
Điều này có thể dựa trên việc chỉ sử dụng C quá lâu, nhưng tôi hầu như luôn kết thúc bằng phương pháp C-ish này. Chẳng hạn, tôi có một tệp có một số gồm 4 chữ số nằm rải rác, tất cả đều bắt đầu bằng 0. Vì vậy, tôi cần tìm "0" và lấy nó và 3 ký tự tiếp theo, và tiếp tục mà không cần sao chép số nếu có 0 khác theo sau nó. Không có phương thức "for c in str" hay "for i, c in enum Cả (str)" hoạt động vì tôi cần kiểm soát chỉ mục. Tôi chắc chắn rằng một biểu thức thông thường sẽ tốt hơn nhiều, mặc dù.
gkimsey

1
for i in range(len(...))là xấu xa Trong python 2.x, range()tạo một danh sách, vì vậy trong một thời gian rất dài, bạn có thể sẽ phân bổ một khối bộ nhớ rất lớn. Ít nhất là sử dụng xrange()trong những trường hợp đó. Ngoài ra, việc lập chỉ mục lặp lại của cùng một chuỗi chậm hơn nhiều so với việc lặp trực tiếp qua chuỗi. Nếu bạn cần chỉ mục, sử dụng enumerate().
izak

6

Vâng, bạn cũng có thể làm một cái gì đó thú vị như thế này và thực hiện công việc của mình bằng cách sử dụng vòng lặp

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

Câu trả lời là

Ông . S uryaa

Tuy nhiên, vì phạm vi () tạo danh sách các giá trị theo thứ tự, do đó bạn có thể trực tiếp sử dụng tên

for e in name:
    print(e)

Điều này cũng tạo ra kết quả tương tự và cũng có vẻ tốt hơn và hoạt động với bất kỳ chuỗi nào như danh sách, bộ dữ liệu và từ điển.

Chúng tôi đã sử dụng chức năng kéo được xây dựng (BIFs trong cộng đồng Python)

1) phạm vi () - phạm vi () BIF được sử dụng để tạo chỉ mục Ví dụ

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

2) len () - len () BIF được sử dụng để tìm ra độ dài của chuỗi đã cho


4

Nếu bạn muốn sử dụng một cách tiếp cận chức năng hơn để lặp qua một chuỗi (có lẽ để chuyển đổi nó bằng cách nào đó), bạn có thể chia chuỗi thành các ký tự, áp dụng một hàm cho từng chuỗi, sau đó nối danh sách kết quả của các ký tự thành một chuỗi.

Một chuỗi vốn là một danh sách các ký tự, do đó 'map' sẽ lặp lại chuỗi đó - như là đối số thứ hai - áp dụng hàm - đối số thứ nhất - cho mỗi ký tự.

Ví dụ, ở đây tôi sử dụng cách tiếp cận lambda đơn giản vì tất cả những gì tôi muốn làm là một sửa đổi nhỏ cho ký tự: ở đây, để tăng từng giá trị ký tự:

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

hay nói chung hơn:

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

trong đó my_function lấy giá trị char và trả về giá trị char.


2

Một số câu trả lời ở đây sử dụng range. xrangenói chung là tốt hơn vì nó trả về một trình tạo, thay vì một danh sách được khởi tạo đầy đủ. Trong đó bộ nhớ và hoặc các vòng lặp có độ dài khác nhau có thể là một vấn đề, xrangelà ưu việt.


1
lưu ý rằng điều này chỉ áp dụng cho Python 2, hiện đang hy vọng là một thiểu số đang thu hẹp
Sam Mason

0

Nếu bạn từng chạy trong một tình huống mà bạn cần get the next char of the word using __next__(), hãy nhớ tạo string_iteratorvà lặp lại nó chứ không phảioriginal string (it does not have the __next__() method)

Trong ví dụ này, khi tôi tìm thấy char = [Tôi tiếp tục tìm từ tiếp theo trong khi tôi không tìm thấy ], vì vậy tôi cần sử dụng __next__

đây là một vòng lặp cho chuỗi sẽ không giúp

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.