从索引开始遍历python字符串

从索引开始遍历python字符串,python,string,iterator,character,Python,String,Iterator,Character,如果我有一个很长的字符串(比如说1亿个字符),有没有一种方法可以使用类似str中c的来迭代字符:但是在str中开始一定数量的字符?我不希望分割字符串并使用子集,因为我知道分割字符串将生成副本(在我的情况下非常昂贵)。换句话说,我可以为字符串上的迭代器指定一个起点吗?您可以使用字符串索引,就像它的列表一样: for i in xrange(100, 200): print(s[i]) 在python3中,range是一个生成器,而不是列表。这意味着以下代码不需要过多内存: for i i

如果我有一个很长的字符串(比如说1亿个字符),有没有一种方法可以使用类似str中c的
来迭代字符:
但是在str中开始一定数量的字符?我不希望分割字符串并使用子集,因为我知道分割字符串将生成副本(在我的情况下非常昂贵)。换句话说,我可以为字符串上的迭代器指定一个起点吗?

您可以使用字符串索引,就像它的列表一样:

for i in xrange(100, 200):
    print(s[i])

在python3中,range是一个生成器,而不是列表。这意味着以下代码不需要过多内存:

for i in range(start_pos, len(my_string)):
   print(my_string[i])
如果您希望在
my_string
上使用迭代器,则需要自己编写:

def iter_starting_at(start_pos, string):
    for i in range(start_pos, len(string)):
        yield string[i]

for character in iter_starting_at(start_pos, my_string):
    print(character)
考虑使用以下方法:

from itertools import islice

for c in islice(my_str, start, stop):
    print(c)

我们可以使用
itertools.islice
,而不是在字符串中生成索引,它返回一个切片上的迭代器

for c in itertools.islice(my_enormous_string, start_pos):
    ...

哦,如果有区别的话,我主要使用的是Python3。但我也有兴趣知道2.7的情况,因为每次使用索引听起来都很慢。但也许它和迭代器一样快
range(100100000000)
在我看来非常密集,尽管我可能还是错了,因为range结果可能是一个迭代器,而不是实际的列表。在Python 3中,
range
是一个迭代器。。。在Python2.7中不是这样,您应该使用
xrange
@donkopotamus谢谢,我已经将range替换为xrange。请注意,
islice
实际上会在第一个
start\u pos
字符上迭代,但不会执行任何操作。对于较大的起始位置,字符串索引将更快。+1用于使用内置的islice。但从代码上看,这只是一个范围操作符,并不适合@poke所说的大起始位置。请注意,
islice
实际上会迭代第一个
start\u pos
字符,但不会执行任何操作。对于较大的起始位置,字符串索引将更快。@poke,绝对正确。我倾向于忘记其行为中的细微差别:(