我有这段代码:
n = int (input ('Enter the Number of Players: '))
m = [[j] for j in range (0, n)]
all_names= []
i = 0
while n > 1:
m[i] = input('Player {0}: '.format (i+1))
all_names.extend ([m[i]])
if m[i][0] != m[i-1][-1]:
b= m.pop (i)
n = n-1
if all_names.count (m[i]) == 2:
n = n-1
b= m.pop (i)
i = i+1
它表示索引超出范围(第二个if子句) 但我不明白,为什么?
答案 0 :(得分:0)
我讨厌不直接回答你的问题,但是你想要做的事情似乎......真的让人困惑。 Python有一种规则,它应该是一种非常清晰,干净的处理方式,所以如果一段代码看起来非常时髦(特别是对于这么简单的函数),它可能没有使用正确的方法。
如果您只想创建一个名称容器,有许多更简单的方法:
players=int(input("How many players?\n"))
player_names=set()
while len(player_names)<players:
player_names.add(input("What is player {}'s name?\n".format(len(player_names)+1)))
...将为您提供一组独特的玩家名称,但不会订购。这可能很重要(你的实现保持顺序,所以可能是这样),在这种情况下你仍然可以使用一个列表并添加一个小的检查,以确保你添加一个新名称,而不是重复添加名称:
players=int(input("How many players?\n"))
player_names=list()
while len(player_names)<players:
playname=input("What is player {}'s name?\n".format(len(player_names)+1))
if playname not in player_names:
player_names.append(playname)
我向那些嘲笑我躲避问题的人敞开心扉,特别是如果提问者接受这种方法的目的/原因。
答案 1 :(得分:0)
每次代码进入第一个if子句时,m的长度都会减小。但是,在每次迭代中增加i的值。因此,在长度为m的中点(如果始终输入第1个子句)或稍后,i的值将大于m的值,并且您将获得超出范围的索引。