简体   繁体   English

如果If为True,则使用Else语句进行编程

[英]Programming resorting to Else statement when If is True

I am working with a list of dictionaries: 我正在处理词典列表:

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)]}]

I need to write a function that searches for a dictionary by the students name, looks to see if there is matching assignment name and grade. 我需要编写一个按学生姓名搜索字典的函数,以查看是否有匹配的作业名称和年级。 If there is it returns True, if there isn't it returns False and adds it too the list. 如果存在,则返回True,否则返回False,并将其添加到列表中。 I am close with what I have, but regardless of if I type a true or false set if parameters it reads false and adds the assignment in as a tuple. 我已经掌握了什么,但是无论我键入的是true还是false,如果参数读取为false并将赋值添加为元组,则无论如何。

Can you help me find the missing piece of instruction needed in this function? 您能帮我找到此功能所需的缺少说明吗?

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)

EDIT: The first answer helped me get the code working (Thanks!) 编辑:第一个答案帮助我使代码正常工作(谢谢!)

Now I've bulked it out and made it sloppier so that instead of an assignment being added twice with two different grades it puts an output that it exists already. 现在,我将其放宽并使其变得更松散,这样就不必将作业添加两次并添加两个不同的等级,而是将其放置为已经存在。 What I have made is bulky and messy, and it seems like the fix should be easy but I can't figure it out. 我制作的东西笨拙且杂乱,似乎修复起来很容易,但我不知道。 Thoughts? 思考?

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)

The issue is that, for a single student, "assignments" is a list of tuples and, in the first, case you compare the whole list to a single tuple, and in the second case, you just check if the assignment_name (the first position of a tuple) is in the list. 问题是,对于一个学生, "assignments"是一个元组列表,在第一种情况下,您将整个列表与一个元组进行比较,在第二种情况下,您只需检查是否assignment_name (第一个元组的位置)在列表中。

You can change the assignment existence check to : 您可以将作业存在检查更改为:

if (assignment_name, grade) in s['assignments']:
    print(True)
else:
    s['assignments'].append((assignment_name, grade))
    print(False)

Additionally, to limit the indentation and make things easier to read, you can use next to find the correct student dictionary. 另外,为了限制缩进并使内容更易于阅读,您可以使用next查找正确的学生词典。 Then you'll have: 然后您将拥有:

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)

Edit : Allowing only one grade per assignment (no overwriting): 编辑 :每个作业仅允许一个成绩(不得覆盖):

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)

or (simpler logic, but slightly more computation): 或(逻辑更简单,但计算量略多):

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)

With overwriting: 覆盖:

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)

The result returned from any will be either True or False . any返回的结果将为TrueFalse That will never compare equal to (assignment_name, grade) . 那将永远不会等于(assignment_name, grade)

It's unclear if you want to match only the name, or the name and grade. 尚不清楚您是否只希望匹配名称或名称等级。 Either way you will need a loop to search through the possibilities. 无论哪种方式,您都将需要一个循环来搜索可能性。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM