fPython:从随机的字母列表中创建一个新列表

时间:2016-10-07 18:55:03

标签: python list 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']#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
  

有人可以帮忙吗?

     

在此代码之后,我将为用户创建一个输入语句,以便从这些字母中生成一个单词。

5 个答案:

答案 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)