不接受列表索引?

时间:2013-08-18 20:07:22

标签: python-3.x

我有这段代码:

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子句) 但我不明白,为什么?

2 个答案:

答案 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的值,并且您将获得超出范围的索引。