这个程序已经导入了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()

我一直在用编造的数据对其进行测试.主要问题是,当我try 在问题类的Ask()函数的for循环中使用变量时,该函数将不会让我从工作表输入数据.以下是返回的内容:

PYGAME 2.5.2(SDL2.28.3,PYTHON3.11.5) 来自PYGAME社区的你好.https://www.pygame.org/contribute.html个 你喜欢豆子吗? 你得到了多少个答案? 回溯(最近一次呼叫): 中第51行的文件"C:\USERS\Me\Documents\MATH\Surfacy.py" Main() Main中第48行的文件"C:\USERS\Me\Documents\Math\Surfacy.py" Q1.Ask() 在Ask中,第33行,文件"C:\USERS\Me\Documents\MATH\Surfacy.py" 对于i,单位为int(点): TypeError:‘int’对象不可迭代

有没有人能帮助我理解我做错了什么,以及我如何才能改正它.

推荐答案

您在代码中有几个问题,让我们分部分来看:

迭代n次

您显示的错误的原因在行中

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循环中通过在范围上迭代而递增.

另一种不那么强势的 Select 是使用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):

例如,如果self.dat有6个子列表,则返回3self.dat的子列表都有2个项,因此self.dat[i][2]将是无效的索引.

在任何情况下,您都应该这样做:

for i in range(len(len(self.dat)):
    for j in range(2):

过滤列表

另一个问题是,在您的filt方法中,您在迭代列表的同 timeshift 除其中的项.这样做会使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

用户输入用户输入

你的代码中的另一个问题是,显然用户必须输入"yes"或"no"作为答案,但你的代码做到了:

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()

Python相关问答推荐

如果条件为真,则Groupby.mean()

scikit-learn导入无法导入名称METRIC_MAPPING64'

无法使用requests或Selenium抓取一个href链接

如何在Python数据框架中加速序列的符号化

无法使用DBFS File API路径附加到CSV In Datricks(OSError Errno 95操作不支持)

如何将多进程池声明为变量并将其导入到另一个Python文件

如何指定列数据类型

旋转多边形而不改变内部空间关系

lityter不让我输入左边的方括号,'

PYTHON、VLC、RTSP.屏幕截图不起作用

一个telegram 机器人应该发送一个测验如何做?""

你能把函数的返回类型用作其他地方的类型吗?'

当输入是字典时,`pandas. concat`如何工作?

比较两个有条件的数据帧并删除所有不合格的数据帧

Matplotlib中的曲线箭头样式

我怎样才能让深度测试在OpenGL中使用Python和PyGame呢?

我可以同时更改多个图像吗?

解析CSV文件以将详细信息添加到XML文件

如何在Python中画一个只能在对角线内裁剪的圆?

合并Pandas中的数据帧,但处理不存在的列