Python lndexError:列表索引超出范围

Python lndexError:列表索引超出范围,python,list,range,Python,List,Range,我需要从列表take_中给出的随机字母生成一个字符串。第一次执行该函数时,它生成了一个短语,但我接下来的所有尝试都提示了一个错误“列表索引超出范围”。在我的例子中,我无法理解这个错误,我尝试了while循环而不是for循环,但也没有成功 from random import randint def make_a_phrase(): random_string = '' take_from = ['a','b','c','d','e','f','g','h','i','j','k

我需要从列表take_中给出的随机字母生成一个字符串。第一次执行该函数时,它生成了一个短语,但我接下来的所有尝试都提示了一个错误“列表索引超出范围”。在我的例子中,我无法理解这个错误,我尝试了while循环而不是for循环,但也没有成功

from random import randint

def make_a_phrase():
    random_string = ''
    take_from = ['a','b','c','d','e','f','g','h','i','j','k','l',
                'm','n','o','p','q','r','s','t','v','u','w','x',
                'y','z',' ']
    for i in range(28):
        random_string = random_string + take_from[randint
                                    (0,len(take_from))]
    return random_string

在Python中,列表索引的整数范围为小于列表长度的0到1。例如,一个包含10项的列表的索引范围为0到9

randint()
的调用试图获取从零到列表全长的索引,这将导致此异常。将其更改为:

for i in range(28):
    random_string = random_string + take_from[randint
                                    (0,len(take_from)-1)]

random.randint(a,b)

返回一个随机整数N,这样a您应该将循环更改为:

for i in range(0, len(take_from)):

由于列表中只有27个元素,而不是28个元素,您当前遇到了一个off by one错误。

您可以尝试类似的方法

from string import ascii_lowercase
import random

def make_a_phrase():
    return ''.join(random.choice(ascii_lowercase + ' ') for i in range(28))

发生这种情况的原因是
len
返回长度,但最后一个索引始终是长度-1(因为索引从0开始)

所以最终,出现的随机整数是长度,当然,在这个数字上没有元素

下面是一个简单的例子:

>>> i = [1,2,3]
>>> len(i)
3
>>> i[len(i)]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

错误来自
random.randint()
,它将使用
len(take\u from)
本身作为一个可能的整数。这不是因为i循环的
,因为她从不尝试使用
i
作为索引。
>>> i[len(i)-1]
3