程序已经导入了pygame,但是还不会使用。这是我的代码,以及我想要它做什么的解释。:
import pygame as pg
import csv
import math
import os
# question class
class question():
def __init__(self,qst):
self.qst = qst
self.dat = []
print(self.qst)
# data filter
def filt(self):
i = 0
j = 1
for i in len(self.dat):
for j in len(self.dat)/2:
if self.dat[i][j] == 1:
self.dat.pop(i)
i += 1
j += 2
print(self.dat)
# adding data:
def ask(self):
x = True
y = 1
n = 2
Y = 1
N = 2
yes = 1
no = 2
points = input("how many answers did you get?")
points = int(points)
print(points)
for i in points:
#get data
a1 = input("please enter a1 \n")
a2 = input("please enter a2 \n")
a = [int(a1),int(a2)]
self.dat.append(a)
os.system("cls")
i += 1
os.system("cls")
print(self.dat)
def search(self):
print("TODO: make this work")
q1 = question("do you like beans?")
def main():
q1.ask()
q1.filt()
if __name__ == "__main__":
main()
我一直用虚构的数据进行测试。主要问题是,当我尝试在问题类中的ask()函数的for循环中使用变量时,它不起作用,该函数应该让我从工作表中输入数据。这是返回的内容:
pygame 2.5.2(SDL 2.28.3,Python 3.11.5) 来自 pygame 社区的您好。 https://www.pygame.org/contribute.html 你喜欢豆子吗? 你得到了多少个答案?6 回溯(最近一次调用最后一次): 文件“C:\Users\me\Documents\math\survey.py”,第 51 行,位于 主要的() 文件“C:\Users\me\Documents\math\survey.py”,第 48 行,在 main 中 q1.ask() 文件“C:\Users\me\Documents\math\survey.py”,第 33 行,询问 对于 int(点) 中的 i: 类型错误:“int”对象不可迭代
任何人都可以帮助我了解我在这里做错了什么,以及如何解决它。
您的代码中有几个问题,让我们分部分来看:
您显示的错误原因在行中
for i in points:
其中
points
是一个整数,并且您打算迭代 points
次。正如错误所示,整数不可迭代,要执行您想要的操作,您必须使用内置 [range
]1:
for i in range(points):
# do something
或者如果您不打算使用变量
i
,按照惯例,它使用下划线命名:
for _ in range(points):
# Do something
i += 1
行是不必要的,通过迭代范围,变量已经在for
循环中递增。
另一种不太 Pythonic 的选择是使用
while
循环:
i = 0
while i < points:
# do something
i += 1
与您遇到的错误完全相同
for i in len(self.dat):
for j in len(self.dat)/2:
其中
len
也返回一个整数,因此在这种情况下您还应该使用 range
。
即使纠正上述问题,此循环也会生成无效索引:
for i in range(len(len(self.dat)):
for j in range(len(len(self.dat) // 2):
len(self.dat) // 2
,如果 self.dat
有 6 个子列表,则返回 3
并且 self.dat
的子列表都有 2 个项目,因此 self.dat[i][2]
将是无效索引。
无论如何你应该这样做:
for i in range(len(len(self.dat)):
for j in range(2):
另一个问题是,在您的
filt
方法中,您在迭代列表的同时从中删除项目。这样做会使 for
生成的索引无效,例如:
>>> l = [1, 3, 5]
>>> for i in range(len(l)):
if l[i] == 3:
l.pop(i)
Traceback (most recent call last):
Line 2
if l[i] == 3:
IndexError: list index out of range
当循环删除 3 时,列表的长度仍为 2,并且循环最后一次迭代生成的索引 2(记住索引从 0 开始)现在无效。
有多种方法可以解决这个问题,从使用列表的副本到按相反顺序迭代:
>>> l = [1, 2, 3]
>>> for i in range(len(l) - 1, -1, -1):
if l[i] == 2:
l.pop(i)
>>> l
[1, 3]
或者直接生成一个包含过滤后的项目的新列表,例如,在您的情况下,要消除第二个答案是
1
的条目,您可以这样做:
self.dat = [ans for ans in self.dat if ans[1] != 1]
在不使用列表压缩的情况下,相当于:
dat = []
for ans in self.dat:
if ans[1] != 1:
dat.append(ans)
self.dat = dat
代码中的另一个问题是,显然用户必须输入“是”或“否”作为答案,但您的代码确实如此:
a1 = input("please enter a1 \n")
a2 = input("please enter a2")
a = [int(a1), int(a2)].
如果用户输入无法转换为整数的字符串,则会生成
ValueError
。您必须验证输入并将是/否转换为 1/0,例如使用条件:
a1 = input("please enter a1").lower()
if a1 in ("y", "yes"):
a1 = 1
elif a1 in ("n", "no"):
a1 = 0
else:
print("Invalid input...")
或将输入映射到其内部值的字典等。
考虑到以上所有因素:
import os
# question class
class Question:
def __init__(self, qst):
self.qst = qst
self.dat = []
print(self.qst)
# data filter
def filt(self):
self.dat = [ans for ans in self.dat if ans[1] != 1]
print(self.dat)
@staticmethod
def get_asnswer(msg):
valid_answ = {
"n": 0,
"no": 0,
"y": 1,
"yes": 1
}
while True:
user_answ = input(msg)
if (answ := valid_answ.get(user_answ.lower())) is not None:
return answ
print("Invalid answer, try again...")
# adding data:
def ask(self):
points = int(input("how many answers did you get? "))
print(points)
for _ in range(points):
# get data
a1 = self.get_asnswer("please enter a1 \n")
a2 = self.get_asnswer("please enter a2 \n")
self.dat.append([a1, a2])
os.system("cls")
print(self.dat)
def search(self):
print("TODO: make this work")
def main():
q1 = Question("do you like beans?")
q1.ask()
q1.filt()
if __name__ == "__main__":
main()