【问题标题】:Moving a String from one list to another将字符串从一个列表移动到另一个列表
【发布时间】:2015-06-24 03:17:14
【问题描述】:

每当我运行程序时,它都会出现错误

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)

任何人都可以发现我可能放置的错误,如果他们愿意,可以更正它吗?

【问题讨论】:

  • 发布完整的回溯?哪一行导致错误?
  • 您是否尝试过设置一些断点并逐步执行?您可能会找到问题所在。
  • @ZdaR 有点长的代码,如果我编辑我的帖子并输入完整的代码,它会填满一个屏幕页面......你确定吗?只要你确认,我不介意
  • 它没有明显的停止点。如果我不得不猜测,发生的事情是类列表为空,而随机数仍然产生 0——然后尝试找到空列表的索引 0,然后 kablooie。 (只是猜测,我不完全确定尝试访问空列表的索引 0 会做什么)。如果我的猜测是正确的,那么将整个事情包装在一段时间内 len(classlist) != 0 块应该可以解决问题。 (编辑:没关系,这不起作用。嗯。)
  • @RedShift 你能解释一下什么是断点吗?最好有例子

标签: python list


【解决方案1】:

从我收集到的您的代码试图做的事情来看,我相信下面的代码会实现它。它有点短,但基本上可以在没有崩溃的情况下完成您所做的事情。

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)

请注意,如果您多次运行此程序,您会发现它确实给出了不同的“匹配装置”。

【讨论】:

  • Match1, Match2, Match3, Match4 = zip(ClassList[::2], ClassList[1::2])
  • 是的,这很 Pythonic,我只是选择了更长、更简单的方法。
【解决方案2】:

您在迭代时正在修改您的课程列表。当它抛出错误时,您的班级中没有人可以选择 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])

【讨论】:

    【解决方案3】:

    解决方案 1:
    在第二个 Temp 分配之后del ClassList[Random1]

    解决方案 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()]
    

    不要根据PEP8使用大写的变量名

    【讨论】:

    • 这并不能解决问题。问题的出现是因为 'del' 关键字和它改变了列表长度。反过来,允许曾经有效的索引位置变得无效。
    • @RedShift make len(ClassList)-1 将修复随机数以匹配新列表长度
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    相关资源
    最近更新 更多