2015-06-24 206 views
0

每當我運行程序時,它要麼錯誤移動一個字符串從一個列表到另一個

Traceback (most recent call last): 
    File "C:\Users\mrosales\Downloads\Rock Paper Sissor Tornament.py", line 46, in <module> 
    Temp = ClassList[Random2] 
IndexError: list index out of range 

Traceback (most recent call last): 
    File "C:\Users\mrosales\Downloads\Rock Paper Sissor Tornament.py", line 60, in <module> 
    Temp = ClassList[Random2] 
IndexError: list index out of range 

我的代碼是關於從一個列表移動串到另一個形成tornamnet的一套遊戲大作

import random 
import time 
Temp = (" ") 
ClassList = ['Noah','Simone','Ji Ho','Thanh','Nathanial','Soo','Mickel','Tuan'] 
Match1 = [], Match2 = [], Match3 = [] ,Match4 = [] 
Random1 = random.randrange(0,len(ClassList)) 
Random2 = random.randrange(0,len(ClassList)) 
while Random1 == Random2: 
    Random1 = random.randrange(0,len(ClassList)) 

time.sleep(1) 
Temp = ClassList[Random1] 
Match1.append(Temp) 
del ClassList[Random1] 
Temp = ClassList[Random2] 
del ClassList[Random2] 
Match1.append(Temp) 

print(Match1) 
Random1 = random.randrange(0,len(ClassList)) 
Random2 = random.randrange(0,len(ClassList)) 
while Random1 == Random2: 
    Random1 = random.randrange(0,len(ClassList)) 

time.sleep(1) 
Temp = ClassList[Random1] 
Match2.append(Temp) 
del ClassList[Random1] 
Temp = ClassList[Random2] 
del ClassList[Random2] 
Match2.append(Temp) 

print(Match2) 
Random1 = random.randrange(0,len(ClassList)) 
Random2 = random.randrange(0,len(ClassList)) 
while Random1 == Random2: 
    Random1 = random.randrange(0,len(ClassList)) 

time.sleep(1) 
Temp = ClassList[Random1] 
Match3.append(Temp) 
del ClassList[Random1] 
Temp = ClassList[Random2] 
del ClassList[Random2] 
Match3.append(Temp) 

print(Match3) 
Random1 = random.randrange(0,len(ClassList)) 
Random2 = random.randrange(0,len(ClassList)) 
while Random1 == Random2: 
    Random1 = random.randrange(0,len(ClassList)) 

time.sleep(1) 
Temp = ClassList[Random1] 
Match4.append(Temp) 
del ClassList[Random1] 
Temp = ClassList[Random2] 
del ClassList[Random2] 
Match4.append(Temp) 

print(Match4) 
Random1 = random.randrange(0,len(ClassList)) 
Random2 = random.randrange(0,len(ClassList)) 
while Random1 == Random2: 
    Random1 = random.randrange(0,len(ClassList)) 

print ("The current match ups are...") 
print (Temp) 
time.sleep(1) 
print (Match1, Match2, Match3, Match4) 

任何人能發現我可能已經放置,如果他們願意的話,糾正錯誤?

+1

發佈完整的追溯?哪一行導致錯誤? – ZdaR

+0

你有沒有試過把一些突破點和步進?你可能會找到問題所在。 –

+0

@ZdaR它的一種長碼,如果我編輯我的文章並輸入完整的代碼,它會填充多於屏幕頁面...你確定嗎?我不介意只要你確認 –

回答

4

從我所收集你的代碼是試圖做的,我相信下面的代碼將實現它。它比較短,但是基本上可以做到沒有崩潰的情況。

import random 

ClassList = ['Noah', 'Simone', 'Ji Ho', 'Thanh', 'Nathanial', 'Soo', 'Mickel', 'Tuan'] 

# Randomise list order 
random.shuffle(ClassList) 

# Remove last 2 elements from list and add to new match lists 
Match1 = [ClassList.pop(), ClassList.pop()] 
Match2 = [ClassList.pop(), ClassList.pop()] 
Match3 = [ClassList.pop(), ClassList.pop()] 
Match4 = [ClassList.pop(), ClassList.pop()] 

print(Match1, Match2, Match3, Match4) 

請注意,如果您多次運行此操作,您將看到它確實會給出不同的「匹配裝置」。

+0

'Match1,Match2,Match3,Match4 = zip(ClassList [:: 2] ,ClassList [1 :: 2])' – TessellatingHeckler

+0

是的,這是非常pythonic,我只是去更長,更簡單的方式。 –

-1

解決方案1:
del ClassList[Random1]後第二Temp分配。

解決方案2:
Random2 = random.randrange(0,len(ClassList)-1)將解決您的問題,然後您不需要Random1 != Random2您的情況。

更重要的是:
應該清理一下你的代碼...

temp = classList.pop(random1) 

相當於

temp = classList[random1] 
del classList[random1] 

使用照顧重複代碼的功能:

def get_random(): 
    random_index = random.randrange(0,len(classList)) 
    return classList.pop(random_index) 

match1 = [get_ramdom(), get_random()] 

不要根據01不要使用大寫變量名

+0

這不能解決問題。這個問題是由於'del'關鍵字引起的,它改變了列表長度。反過來,允許一旦有效的指數頭寸失效。 –

+0

@RedShift使'len(ClassList)-1'可以修復隨機匹配**新列表長度** – LittleQ

0

,你通過它迭代要修改你的類列表。當它拋出錯誤時,你的班級中沒有人會選擇len(ClassList)0。

如果我明白你正在嘗試做的,你可以只創建另一個列表,併爲您遍歷原來的列表來跟蹤誰一直匹配的追加名字給它。或甚至更好地使用random.shuffle

import random 
import time 
classlist = ['Noah','Simone','Ji Ho','Thanh','Nathanial','Soo','Mickel','Tuan'] 
from random import shuffle 

def get_random(classlist): 
    shuffle(classlist) 
    while classlist: 
    yield classlist.pop() 

matches = [] 
match = [] 

for player in get_random(classlist): 
    if len(match) <= 1: 
     #print "Adding %s" %player 
     match.append(player) 
     if len(match) == 2: 
      matches.append(match) 
      #print "Match %s is full" %len(matches) 
      match = [] 

for x in range(0,len(matches)): 
    print "Match %s: %s" %(x,matches[x]) 
相關問題