2016-10-07 82 views
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']#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個放在可以看到的機架中。它顯示了我多次查看的錯誤,但我看不出錯在哪裏。fPython:從一個隨機的字母列表中創建一個新列表

I put comments on the side to understand the code.

它顯示了這個錯誤:

rack.append(bag_of_letters.pop(random.randint(0,len(letters)-1))) 
IndexError: pop index out of range 

Can someone please help?

After this code, I am going to make a input statement for the user to make a word from those letters.

+0

'bag_o_letter'沒有足夠的元素來處理'pop'。 –

+0

我不確定我是否理解你要做什麼,但是你的錯誤是由於你試圖用bag_of_letters中的一個隨機索引在區間[0..25]中彈出一個項目而引起的(因爲len(字母)-1 = 25),並且bag_of_letters僅在第一次迭代中包含單個項目。首先是 – dkasak

+0

。你在bag_o_letters&bag_o_letter有一些錯別字。第二:「我」做什麼? –

回答

1

你從letters長度選擇指數popbag_of_letters這顯然更大。

而應該做的:

rack.append(bag_of_letters.pop(random.randint(0, len(bag_of_letters)-1))) 
#             ^^^^^^^^^^^^^^ 

不過,也有可能是更多的問題與您的代碼。我會建議你的代碼或random.shuffle一行在列表的副本使用random.sample,然後截至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'] 
+0

如果我這樣做,那麼列表中的所有代碼都將保持不變?另外,我可以替換機架的隨機索引嗎? – drewteriyaki

+1

如果你抽樣,你的原稿不會被修改。 「shuffle」方法要求您像我一樣創建一個副本。第二個Q不清楚 –

+1

在未加權的字母列表中使用random.sample(或random.shuffle)會導致錯誤的機架,因爲它是從單個線性字母表中選擇的,而不是字母。你有機會選擇一個z和一個s,你只能得到一個e,等等。 – TigerhawkT3

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) 
+0

這個答案很好,但我還沒有學過'bag_of_letters = [l * c for l,c in zip(letters,letter_count)]''。 – drewteriyaki

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)) 
+0

是的!謝謝!這個拼字遊戲!好猜! – drewteriyaki

+0

該代碼仍然說彈出索引超出範圍。 – drewteriyaki

+0

啊,是的,你需要'len(bag_o_letter) - 1',我想。我編輯了答案。 – csinchok

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] 
+0

僅僅因爲你看到了更好的答案並不意味着你應該改變自己的答案。你應該有信心。 – drewteriyaki

+1

同意。我的回答不足,雖然它並沒有從包裏取出信件。 –

0

的IndexError預計:

pop(...) L.pop([index]) -> item -- remove and return item at index (default last). Raises IndexError if list is empty or index is out of range.

您需要從通話的範圍減去1 random()之後每pop()。現在你這樣做是:

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 

所以取而代之,基於len(bag_o_letter),而不是len(letter)pop()