使用Python迭代字符串中的每个字符


516

在C ++中,我可以std::string像这样迭代:

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

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

如何在Python中遍历字符串?

Answers:


441

正如约翰内斯指出的那样,

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

您可以使用struct迭代python中的几乎所有内容for loop

例如,open("file.txt")返回文件对象(并打开文件),对其进行迭代,然后对该文件中的行进行迭代

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

如果那看起来像魔术,那还算不错,但是它背后的想法真的很简单。

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

只需实现定义一个next()方法的迭代器,然后__iter__在类上实现一个方法使其可迭代即可。(__iter__当然,应返回一个迭代器对象,即定义的对象next()

参阅官方文件


14
请注意,反向迭代的存档内容为:for c in reversed(“ string”)
AkseliPalén2012年

您从文档的哪一部分知道字符串是迭代器类型?
winklerrr

dir()一个字符串..you,具有 iter 属性。
shadow0359 '17

312

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

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

9
专家提示:从零开始。如果你需要从一个启动:1 t2 e3 s4 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 2014年

7
@MauroVanetti这几乎肯定是因为你使用Python 3,当我回答了这个问题有AFAIK只有Python的2
约翰内斯·魏斯

37

只是为了做出更全面的回答,如果您确实想将方钉强行塞入圆孔中,则对字符串进行迭代的C方法可以在Python中应用。

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

但是话又说回来,当字符串具有固有的可迭代性时,为什么要这样做呢?

for i in str:
    print i

6
代替您的第一个while循环,您可以执行以下操作:对于range(len(str()))中的i:print(str [i])在我看来,这比必须自己管理计数器要好。更好的是marcog使用枚举的答案。
iiham 2011年

1
这可能是基于使用C了这么长时间,但我几乎总是最终使用这种C-ish方法。例如,我有一个文件,其中分散了一些4位数字,所有数字均以0开头。因此,我需要找到一个“ 0”并抓住它和接下来的3个字符,然后继续操作,而不必重复数字跟在其后的另一个0。因为我需要控制索引,所以“ for str中的c”或“ enumerate(str)中的i,c”方法都不起作用。不过,我敢肯定正则表达式会更好。
gkimsey 2013年

1
for i in range(len(...))是邪恶的。在python 2.x中,range()创建一个列表,因此对于很长的长度,您可能最终会分配很大的内存块。至少xrange()在这些情况下使用。同样,重复索引同一字符串比直接在字符串上迭代慢得多。如果需要索引,请使用enumerate()
izak

6

好吧,您也可以像这样做一些有趣的事情,并通过使用for循环来完成您的工作

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

答案是

先生 。苏里亚

但是,由于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用于找出给定字符串的长度


4

如果您想使用一种更实用的方法遍历字符串(可能以某种方式进行转换),则可以将字符串拆分为字符,对每个函数应用一个函数,然后将所得的字符列表重新组合为字符串。

字符串本质上是一个字符列表,因此“ map”将遍历字符串-作为第二个参数-将函数-第一个参数应用于每个参数。

例如,这里我使用一种简单的lambda方法,因为我要做的只是对字符的微不足道的修改:在这里,增加每个字符的值:

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

或更一般而言:

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

其中my_function接受一个char值并返回一个char值。


2

这里使用几个答案rangexrange通常会更好,因为它返回生成器,而不是完全实例化的列表。在内存和/或长度可变的可迭代项可能成为问题的情况下,它xrange是优越的。


1
注意,这仅适用于Python的2这是希望萎缩少数现在
萨姆·梅森

0

如果您曾经在需要的情况下运行get the next char of the word using __next__(),请记住创建一个string_iterator并对其进行迭代,而不要迭代original string (it does not have the __next__() method)

在此示例中,当我找到一个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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.