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