Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python练习基于另一个列表等级从列表中删除_Python_List - Fatal编程技术网

Python练习基于另一个列表等级从列表中删除

Python练习基于另一个列表等级从列表中删除,python,list,Python,List,我正在学习Python,这是我当前的练习: 编写一个程序,将课程的科目(例如:数学、物理、化学、历史和语言)存储在一个列表中,向用户询问他们在每个科目中取得的成绩,并从列表中删除已批准的科目。最后,程序必须在屏幕上显示用户必须重复的主题 我有以下代码: classes = ['math', 'chemistry', 'History', 'Marketing'] gradelist = [] for i in range(len(classes)): grade = int(input

我正在学习Python,这是我当前的练习:

编写一个程序,将课程的科目(例如:数学、物理、化学、历史和语言)存储在一个列表中,向用户询问他们在每个科目中取得的成绩,并从列表中删除已批准的科目。最后,程序必须在屏幕上显示用户必须重复的主题

我有以下代码:

classes = ['math', 'chemistry', 'History', 'Marketing']
gradelist = []

for i in range(len(classes)):
    grade = int(input(f"Please provide your grade in {classes[i]}: "))
    gradelist.append(grade)
print("These are the classes you need to take again because of failure:")
for i in range(len(classes)):
    for y in range(len(gradelist)):
        if gradelist[y] > 69:
            classes.remove(classes[i])
            gradelist.remove(gradelist[y])
        print(f"{classes[i]} Grade : {gradelist[y]}")

谁能帮帮我吗,它坏了。我可以输入成绩,但在删除通过的科目和70分以上的成绩时,我遗漏了一些内容。

我的意思是,您可以使用
类从
类中删除一个项目。删除(类[I])
,然后立即尝试打印具有相同索引的项目:
类[I]
。这不是很奇怪吗

例如,您删除了
类[3]
,然后立即尝试打印
类[3]
。但是
classes
现在少了一个元素!假设你有
类=[0,1,2,3]
,然后你删除了
类[3]
,现在
类=[0,1,2]
。等等,
classes[3]
不再是有效的索引,因此您将得到
索引器:列表索引超出范围


更糟糕的是,如果
classes
有更多的元素,比如
classes=[0,1,2,3,4]
,那么在删除
classes[3]
之后,它将变成
classes=[0,1,2,4]
,所以现在你得到了一个新的
classes[3]==4

要简化程序,请使用zip。这将帮助您迭代两个列表。然后你可以把这些打开

classes = ['math', 'chemistry', 'History', 'Marketing']
gradelist = [int(input(f"Please provide your grade in {classes[i]}: ")) for i in range(len(classes))]
print("These are the classes you need to take again because of failure:")
newGradeList = []
newClassList = []
for classX,grades in zip(classes,gradelist):
    if grades <= 69:
        newGradeList.append(grades)
        newClassList.append(classX)
        print(f"{classX} Grade : {grades}")
另外,为了解释为什么会遇到这样的情况,请不要对正在迭代的列表进行变异/修改。这会导致奇怪的事情发生。相反,您可以创建新列表。 最后,我建议在这种情况下使用字典

classes = ['math', 'chemistry', 'History', 'Marketing']
gradelist = [int(input(f"Please provide your grade in {classes[i]}: ")) for i in range(len(classes))]
data = {clas:grade for clas,grade in zip(classes,gradelist)}
print("These are the classes you need to take again because of failure:")
for k,v in data.items():
    if v <= 69:
        print(f"{k} Grade : {v}")
classes=[“数学”、“化学”、“历史”、“营销”]
成绩表=[int(输入(f“请在{classes[i]}:”)中提供你在范围(len(classes))中i的成绩]
数据={clas:clas的成绩,zip中的成绩(班级,成绩表)}
print(“这些是由于失败而需要再次学习的课程:”)
对于data.items()中的k,v:

如果v不修改正在迭代的列表会安全得多。在这种情况下,这是有意义的,因为要重修的课程列表比可能的课程列表要“本地”得多。所以这里所有的列表缩减都发生在主题列表的本地副本上,因为没有给定的保持分数的要求,所以它只是用于缩减

subjects=“数学物理化学历史语言”.split()
及格分数=70
retakes=subjects.copy()
关于主题中的主题:
grade=int(输入,{subject}的成绩是多少?)
如果等级>=合格等级:
重拍。移除(主题)
如果重新获取:
打印('您需要重新拍摄:')
打印(*重新获取,sep='\n')
其他:
打印('不需要重拍')

尝试输入等级的
80、90、1、2
。您将得到
分数:[90,1,2]
,这是不正确的,因为90应该被删除,但它没有。我没有得到该输出。我得到了历史等级:1市场等级:2我明白了,新代码修正了这一点哦,是的。你在我编辑之前发表了你的评论。我的错。这里真的需要元组列表到dict的转换吗?(上一个示例)非常感谢您所做的一切。@AndresRamirez如果您需要有关此操作的任何进一步解释,请告诉我。只需一个带有
copy
的小说明。在这种情况下,这是完全正确的。但为了将来参考,如果使用它,这里的
副本是浅显的。因此,例如,如果您正在处理类似于
[[1,2,3],5,3,4,5]
的事情,并且您对其进行了复制,那么一旦您更改其中一个内部列表,会发生什么情况,它也会更改您复制到的另一个列表中的列表。要避免这种行为,可以使用deepcopy。更多信息@idjaw-同意,尽管在两种不同的伪装下引用同一个列表的陷阱-并得到高度混乱的错误-实际上是Python的一种仪式。:-)@乔凡·洛尔·费尔。这是一个值得注意的好时机,我一点也不怀念“学校”的编程问题
classes = ['math', 'chemistry', 'History', 'Marketing']
gradelist = [int(input(f"Please provide your grade in {classes[i]}: ")) for i in range(len(classes))]
data = {clas:grade for clas,grade in zip(classes,gradelist)}
print("These are the classes you need to take again because of failure:")
for k,v in data.items():
    if v <= 69:
        print(f"{k} Grade : {v}")