我知道我的索引在这种情况下不能大于8,因此输入10(因此xInput等于9)会导致列表索引超出范围。但是任何大于10的数字似乎都可以正常工作。
我尝试了
while xInput < 0 or xInput >= 9 or 'o' == board[xInput] or 'x' == board[xInput]:
,它确实可以正常工作。但是我似乎无法理解为什么这种方法行之有效,而我的另一种却不行。
这是我的原始代码
board = [1, 2, 3, 4, 5, 6, 7, 8, 9]
xInput = 90
oInput = 90
while xInput < 0 or xInput > 9 or 'o' == board[xInput] or 'x'==board[xInput]:
xInput = int(input("x: ")) - 1
board[xInput] = 'x'
答案 0 :(得分:0)
对于任何大于9的xInput
,您都会陷入while
循环中,因为xInput > 9
是循环中的条件之一。
触发IndexError的代码行:
board[xInput] = 'x'
永远不会到达
答案 1 :(得分:0)
您正在使用or
条条件进行评估。
当任何一个条件为真时,其余条件完全不评估。
example: A or B or C, where A/B/C could be some expression.
The boolean value of this depends on whether any of A/B/C is true.
如果需要更严格地控制,可以尝试使用and
或xor
条件
答案 2 :(得分:0)
输入10(因此{'Circle': 0.3705589911482963, 'Polygon': 0.34775978284076003, 'Square': 0.5312055617001106, 'Star': 0.19850208121615415, 'Trapezoid': 1.5383163853653423}
)引发异常的原因是,您的 nom_1 target id
0 Circle 0 28152
1 Circle 1 9168
2 Polygon 0 24741
3 Polygon 1 11402
4 Square 0 32787
5 Square 1 16810
6 Star 0 31645
7 Star 1 14259
8 Trapezoid 0 71833
9 Trapezoid 1 29348
10 Triangle 0 19078
11 Triangle 1 10777
nom_1_dat = train.groupby(["nom_1","target"]).count()[["id"]].reset_index()
print(nom_1_dat)
nom_1_dict = {}
i_list = []
for i,element in enumerate(nom_1_dat["nom_1"]):
i_list.append(i)
for i,element in enumerate(nom_1_dat["nom_1"]):
if (i+1) < max(i_list):
nom_1_dict[element] = (nom_1_dat["id"][i+1])/(nom_1_dat["id"][i])
print(nom_1_dict)
列表只有9个长度。在您的xInput = 9
循环中,如果{{1 }},因为您将其设置为仅在board
小于 9时循环。
因此,如果while
为9,则它会尝试计算不存在的xInput == 9
,因为列表是从0开始而不是从1开始索引的。因此,
xInput
您首先提到的while循环是正确的,因为在那里,您有一个循环条件xInput
而不是board[9]
,因此只有在board[0] == 1
board[1] == 2
...
board[8] == 9
board[9] == ???
时它才会退出循环正确评估。