我正在尝试制作一个简单的程序来检查学校项目的调查数据,但它不起作用,有人可以帮助我吗?

问题描述 投票:0回答:1

程序已经导入了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”对象不可迭代

任何人都可以帮助我了解我在这里做错了什么,以及如何解决它。

python statistics
1个回答
0
投票

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

迭代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
循环中递增。

另一种不太 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()
© www.soinside.com 2019 - 2024. All rights reserved.