letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']#alphabet
bag_o_letters = []#letters to chose from
letter_count = [9, 2, 2, 4, 12, 2, 3, 2, 9, 1, 1, 4, 2, 6, 8, 2, 1, 6, 4, 6, 4, 2, 2, 1, 2, 1]#random indexes to chose from
for x in range(26):#loops through the random index of letter_count
for i in range(letter_count[x]):#chooses the index
bag_o_letters.append(letters[x])#appends the index of the letter to bag_o_letters
rack = []#list for the person to see
for a in range(7):#makes the list 7 letters long
rack.append(bag_o_letters.pop(random.randint(0,len(letters)-1)))#appends the letter to rack(supposedly...)
print(rack)
在您刚刚阅读的此代码中,应该选择随机字母,并将其中的7个字母放入该人可以看到的机架中。它显示了我多次看过的错误,但我看不出有什么问题。
我将评论放在一边以理解代码。
显示此错误:
rack.append(bag_of_letters.pop(random.randint(0,len(letters)-1)))
IndexError: pop index out of range
有人可以帮忙吗?
在此代码之后,我将为用户创建一个输入语句,以便从这些字母中生成一个单词。
答案 0 :(得分:2)
第一次循环时,您将一个值附加到bag_of_letters
,然后尝试弹出random.randint(0,len(letters)-1)
的索引。它还没有那么多元素可供使用。您可以根据此方法制作所需长度和样本的列表:
letters = ['a', ...]#alphabet
letter_count = [9, ...]#random indexes to chose from
bag_of_letters = [l*c for l,c in zip(letters, letter_count)]
...
rack = random.sample(bag_o_letters, 7)
答案 1 :(得分:1)
您从pop
的{{1}}长度bag_of_letters
选择索引 letters
,这显然更大。
你应该这样做:
rack.append(bag_of_letters.pop(random.randint(0, len(bag_of_letters)-1)))
# ^^^^^^^^^^^^^^
但是,您的代码可能会出现更多问题。我建议你在一行代码中使用random.sample
或在列表的副本上使用random.shuffle
,然后切片直到索引7.两者都会随机给你7个选定的信件:
import random
print(random.sample(letters, 7))
# ['m', 'u', 'l', 'z', 'r', 'd', 'x']
import random
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
letters_copy = letters[:]
random.shuffle(letters_copy)
print(letters_copy[:7])
# ['c', 'e', 'x', 'b', 'w', 'f', 'v']
答案 2 :(得分:0)
所以我认为这是针对拼字游戏的?您的问题是,您要从letters
列表中选择随机索引,而不是bag_o_letters
。也许试试这个:
rack = []
for i in range(7):
index = random.randint(0, len(bag_o_letter) - 1)
rack.append(bag_o_letters.pop(index))
答案 3 :(得分:0)
为什么不这样做:
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
letter_count = [9, 2, 2, 4, 12, 2, 3, 2, 9, 1, 1, 4, 2, 6, 8, 2, 1, 6, 4, 6, 4, 2, 2, 1, 2, 1]#random indexes to chose from
from random import shuffle
all_letters = list(''.join([l*c for l,c in zip(letters, letter_count)]))
shuffle(all_letters)
for i in range(int(len(all_letters)/7)):
print all_letters[i*7:(i+1)*7]
答案 4 :(得分:0)
预计会出现IndexError:
流行(...) L.pop([index]) - > item - 删除并返回索引处的项目(默认为last)。 如果列表为空或索引超出范围,则引发IndexError。
在每个random()
之后,您需要从pop()
的调用范围中减去1。现在你这样做:
l = [1,2,3]
random_idx = 2
l.pop(random_idx)
>>> l == [1,3]
random_idx = 3
l.pop(random_idx)
>>>> IndexError: pop index out of range
相反,pop()
基于len(bag_o_letter)
而不是len(letter)
。