迭代Python中的字符串

时间:2013-07-22 17:29:22

标签: python

我想创建一个逐个输入字符串的脚本

def autotype(info):
    count = len(info) #Countign number of letters of the string
    splitlist = list(info) 
    i = int(count) #getting an error on this line! it accept i=int(0) but my loop doesnt work because of this
    while i>0:
        sys.stdout.write(splitlist[i])
        time.sleep(0.2)
        i -= 1

info = str("hello world")
autotype(info)

错误是:列表索引超出范围 我该如何解决?

7 个答案:

答案 0 :(得分:7)

列表的长度是列表中元素的数量。但是,列表从索引0开始,因此它们将以索引length - 1结束。因此,要按原样修复代码,它应该是i = count - 1。 (您不需要将其强制转换为int,它已经是一个。)

更好的是,只需使用while循环,而不是在for循环中使用计数器进行迭代。您可以使用for循环迭代字符串中的字符。

for ch in info:
    sys.stdout.write(ch)
    sys.stdout.flush()   # as mawimawi suggests, if you don't do this, it will
                         # actually just come out all on one line at once.
    time.sleep(0.2)

您也不需要将"hello world"强制转换为字符串 - 它已经是一个字符串。

答案 1 :(得分:2)

您正在i=len(info)开始循环,这比字符串中的最终索引多一个。字符串(或其他可迭代)中的最后一个索引是len(string) - 1,因为索引从0开始。

请注意,在Python中,您可以(并且被鼓励)使用自然语言结构以及集合易于迭代的事实:

for letter in reversed(info): # Much clearer way to go backwards through a string
    sys.stdout.write(letter)

由于您在评论中已经明确表示您确实希望在文本中前进,因此您可以取出reversed位。您发布的代码将在文本中向后迭代,而不是向前 - 使用标准迭代技术的另一个好处是,如果您做了一些您不想做的事情,那么更容易看到它!

for letter in info: # Very clear that you're going forward through the string
    sys.stdout.write(letter)

最后,正如其他人所提到的,你应该在每次写入后添加对sys.stdout.flush()的显式调用,因为否则不能保证你会定期看到输出(可以写入缓冲区但不能直到很久以后才冲到屏幕上。)

答案 2 :(得分:2)

你的脚本非常不灵活。这是可以做同样的事情。字符串是可迭代的,所以:

def autotype(info):
    for x in info:
        sys.stdout.write(x)
        sys.stdout.flush()  # you need this, because otherwise its' buffered!
        time.sleep(0.2)

这就是你所需要的一切。

答案 3 :(得分:0)

列表为零索引,因此最后一个元素位于len(info)-1

要解决此问题,您需要从计数中减去1:

i = int(count) - 1

答案 4 :(得分:0)

索引从零开始计算...如果列表中有5个项目,则索引为0,1,2,3,4

您要在此行中设置索引超出范围:

i = int(count)

如果count为5,则max index为4。 要将此更改修改为:

i = int(count) - 1

接下来,你不会打印第一个角色。 修改一行改为:

while i>0:

成:

while i>=0:

顺便说一下,你的所有角色都是向后打印的。

答案 5 :(得分:0)

一目了然,但简明扼要:

import time
import sys

autotype = lambda instr:map((lambda ch:(sys.stdout.write(ch), time.sleep(0.2))), instr)

autotype("hello world")

上面代码的主要问题是,如果你不关心它们的返回值,那么使用元组排序两个函数是不常见的。

答案 6 :(得分:0)

以下是“制作将逐个输入字符串字母的脚本”的代码

print info

如果您需要连续输入字符串中的字母,则无需重新发明轮子。

很可能,你的问题没有明确说明。