使用Python遍历字符串中的每个字符

575

如何在Python中对字符串进行迭代(每次通过循环获取字符串中的每个字符)?

9个回答

508

正如 Johannes 指出的那样,

for c in "string":
    #do something with c
你可以使用Python中的for循环结构遍历几乎任何东西,例如open(“file.txt”)返回一个文件对象(并打开文件),在其上进行迭代会遍历该文件中的各行。
with open(filename) as f:
    for line in f:
        # do something with line

如果这看起来像魔法,那么确实有点像,但它背后的思想真的很简单。

有一个简单的迭代器协议,可以应用于任何类型的对象,使得for循环在其上工作。

只需要实现一个定义了next()方法的迭代器,并在类上实现一个__iter__方法,使其成为可迭代的。(当然,__iter__应该返回一个迭代器对象,也就是一个定义了next()的对象)

查看官方文档


18
请注意,使用以下代码可以进行反向迭代:for c in reversed("string") - Akseli Palén
你从文档的哪个部分得知字符串是迭代器类型的? - winklerrr
dir() 函数返回一个字符串,你可以看到 iter 属性。 - ns15

345

如果您需要在遍历字符串时访问索引,请使用enumerate()

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

14
专业提示:它从零开始。如果你需要从1开始:1 t2 e3 s4 t使用参数"start": for i, c in enumerate('test', start=1) - Messa

95

更容易的方法:

for c in "test":
    print c

1
我是Python的新手。由于某种原因,在我的环境中无法编译,我不得不将c放在括号中才能使其工作:for c in "test": print(c)为什么? - Mauro Vanetti
12
几乎可以确定是因为你使用的是Python 3,而我回答问题时只有Python 2。 - Johannes Weiss

40

只是为了给出更全面的答案,如果你真的想把一个方形钉子硬塞到圆孔中,C遍历字符串的方法也可以应用于Python。

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

但话说回来,既然字符串本身就是可迭代的,为什么还要这样做呢?

for i in str:
    print i

7
你可以使用以下代码代替第一个while循环:for i in range(len(str)): print(str[i])在我看来,这比自己管理计数器要好。使用enumerate的marcog的答案更好。 - aiham
1
这可能只是因为我长期使用C语言的缘故,但我几乎总是会使用这种类似C语言的方法。例如,我有一个文件,其中散布着一些以0开头的4位数字。因此,我需要找到一个“0”,并获取它和接下来的3个字符,然后继续前进,如果后面还有另一个“0”,则不重复数字。没有任何“for c in str”或“for i,c in enumerate(str)”方法可用,因为我需要控制索引。虽然我相信正则表达式会更好。 - gkimsey
1
for i in range(len(...)) 是有害的。在 Python 2.x 中,range() 创建一个列表,因此对于非常长的长度,您可能会分配一个非常大的内存块。至少在这些情况下使用 xrange()。此外,重复索引相同字符串比直接迭代字符串要慢得多。如果需要索引,请使用 enumerate() - izak

7

你还可以做一些有趣的事情,比如使用for循环来完成工作。

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

答案是:

Mr. Suryaa

然而,由于range()创建的是值的列表,即序列,因此您可以直接使用名称。

for e in name:
    print(e)

这也会产生相同的结果,并且看起来更好,适用于任何序列,如列表、元组和字典。
我们使用了两个内置函数(Python社区中的BIF)。
1)range()- range()BIF用于创建索引
例如:
for i in range ( 5 ) :
can produce 0 , 1 , 2 , 3 , 4

2) len() - len() BIF 用于查找给定字符串的长度


6
如果您想使用更具功能性的方法来迭代字符串(例如进行某种转换),可以将字符串分割为字符,对每个字符应用一个函数,然后将结果字符列表连接回字符串。
字符串本身就是一个字符列表,因此'map'会遍历字符串,作为第二个参数将第一个参数-函数应用于每个字符。
例如,在这里我使用了一个简单的lambda方法,因为我只想对字符进行微不足道的修改:在此处,递增每个字符值:
>>> ''.join(map(lambda x: chr(ord(x)+1), "HAL"))
'IBM'

更普遍地说:
>>> ''.join(map(my_function, my_string))

这里的 my_function 接收一个 char 值,并返回一个 char 值。


3

这里有几个答案使用了range。但是xrange通常更好,因为它返回一个生成器,而不是完整实例化的列表。在内存和可迭代长度差别大的情况下,xrange更加优秀。


2
请注意,这仅适用于Python 2,希望现在已经是少数派了。 - Sam Mason

2

您还可以执行以下操作:

txt = "Hello World!"
print (*txt, sep='\n')

这段代码不使用循环,但内部的print语句会处理它。

*会将字符串解包为列表并将其发送到print语句中。

sep='\n'将确保下一个字符在新行上打印。

输出结果如下:

H
e
l
l
o
 
W
o
r
l
d
!

如果确实需要使用循环语句,则可以像其他人提到的那样使用for循环,例如:
for x in txt: print (x)

0
如果你遇到需要使用 __next__() 获取单词的下一个字符的情况,请记得创建一个 string_iterator 并在其上进行迭代,而不是在原始字符串上进行迭代(原始字符串没有 __next__() 方法)。
在这个例子中,当我找到一个 char = [ 时,我会继续查找下一个单词,直到找到 ],所以我需要使用 __next__。
在这里,对字符串进行 for 循环是无法帮助的。
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接