[英]Programming resorting to Else statement when If is True
我正在处理词典列表:
student_list = [{'id': 12341, 'first_name': 'Alice', 'last_name': 'Anderson',
'assignments': [('assignment_1', 0), ('assignment_2', 2), ('assignment_3', 4)]},
{'id': 12342, 'first_name': 'Boris', 'last_name': 'Bank',
'assignments': [('assignment_1', 1), ('assignment_2', 3), ('assignment_3', 0)]},
{'id': 12343, 'first_name': 'Carl', 'last_name': 'Cape',
'assignments': [('assignment_1', 2), ('assignment_2', 4), ('assignment_3', 1)]},
{'id': 12344, 'first_name': 'Didi', 'last_name': 'Dawson',
'assignments': [('assignment_1', 3), ('assignment_2', 0), ('assignment_3', 2)]},
{'id': 12345, 'first_name': 'Ed', 'last_name': 'Enders',
'assignments': [('assignment_1', 4), ('assignment_2', 1), ('assignment_3', 3)]}]
我需要编写一个按学生姓名搜索字典的函数,以查看是否有匹配的作业名称和年级。 如果存在,则返回True,否则返回False,并将其添加到列表中。 我已经掌握了什么,但是无论我键入的是true还是false,如果参数读取为false并将赋值添加为元组,则无论如何。
您能帮我找到此功能所需的缺少说明吗?
def add_grade(student, assignment_name, grade):
for s in student_list:
if s['first_name'] == student:
if any(s['assignments']) == (assignment_name, grade):
print(True)
else:
s['assignments'].append((assignment_name, grade))
print(False)
add_grade('Carl', 'assignment_2', 2)
print(student_list)
编辑:第一个答案帮助我使代码正常工作(谢谢!)
现在,我将其放宽并使其变得更松散,这样就不必将作业添加两次并添加两个不同的等级,而是将其放置为已经存在。 我制作的东西笨拙且杂乱,似乎修复起来很容易,但我不知道。 思考?
def add_grade2(student, assignment_name, grade):
for s in student_list:
if s['first_name'] == student:
if (assignment_name, grade) in s['assignments']:
print(True)
elif (assignment_name, 0) in s['assignments']:
print('That assignment has a different grade. ')
break
elif (assignment_name, 1) in s['assignments']:
print('That assignment has a different grade. ')
break
elif (assignment_name, 2) in s['assignments']:
print('That assignment has a different grade. ')
break
elif (assignment_name, 3) in s['assignments']:
print('That assignment has a different grade. ')
break
elif (assignment_name, 4) in s['assignments']:
print('That assignment has a different grade. ')
break
else:
s['assignments'].append((assignment_name, grade))
print(False)
add_grade2('Alice', 'assignment_1', 3)
print(student_list)
问题是,对于一个学生, "assignments"
是一个元组列表,在第一种情况下,您将整个列表与一个元组进行比较,在第二种情况下,您只需检查是否assignment_name
(第一个元组的位置)在列表中。
您可以将作业存在检查更改为:
if (assignment_name, grade) in s['assignments']:
print(True)
else:
s['assignments'].append((assignment_name, grade))
print(False)
另外,为了限制缩进并使内容更易于阅读,您可以使用next
查找正确的学生词典。 然后您将拥有:
def add_grade(student, assignment_name, grade):
s = next(s for s in student_list if s['first_name'] == student)
if (assignment_name, grade) in s['assignments']:
print(True)
else:
s['assignments'].append((assignment_name, grade))
print(False)
编辑 :每个作业仅允许一个成绩(不得覆盖):
for i in range(len(s['assignments'])):
if s['assignments'][i][0] == assignment_name:
if s['assignments'][i][1] == grade:
print(True)
else:
print('That assignment has a different grade.')
return
s['assignments'].append((assignment_name, grade))
print(False)
或(逻辑更简单,但计算量略多):
if (assignment_name, grade) in s['assignments']:
print(True)
elif any(a_name == assignment_name for a_name, _ in s['assignments']):
print('That assignment has a different grade.')
else:
s['assignments'].append((assignment_name, grade))
print(False)
覆盖:
for i in range(len(s['assignments'])):
if s['assignments'][i][0] == assignment_name:
s['assignments'][i] = (assignment_name, grade)
print(True)
return
s['assignments'].append((assignment_name, grade))
print(False)
从any
返回的结果将为True
或False
。 那将永远不会等于(assignment_name, grade)
。
尚不清楚您是否只希望匹配名称或名称和等级。 无论哪种方式,您都将需要一个循环来搜索可能性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.