【问题标题】:Programming resorting to Else statement when If is True当 If 为 True 时编程诉诸 Else 语句
【发布时间】:2018-10-08 11:14:30
【问题描述】:

我正在处理字典列表:

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)

【问题讨论】:

    标签: python


    【解决方案1】:

    问题在于,对于单个学生,"assignments" 是一个元组列表,在第一种情况下,您将整个列表与单个元组进行比较,在第二种情况下,您只需检查 @ 987654322@(元组的第一个位置)在列表中。

    您可以将分配存在检查更改为:

    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)
    

    【讨论】:

    • 太棒了!谢谢!当我与第二个如此接近。我看到的唯一缺陷是有人可以为同一作业给一个学生多个分数,但这显然是我的程序中的一个缺陷,而不是你提供的。
    • 下划线在“a_name == assignment_name for a_name,** _ **in s['assignments']”中的作用
    • @tsb 这只是一个变量,但使用 _ 表示它不会在任何地方使用
    • 好的@tsb,再次更新以匹配您当前的问题:查看大“编辑”之后的第一个代码块
    • 非常感谢亨利。我希望它可以更接近我只有一个 elif 语句所拥有的东西,但这可能是不可能的。有没有办法让一个 elif 语句搜索 0-4?
    【解决方案2】:

    any 返回的结果将是TrueFalse。这将永远比较等于(assignment_name, grade)

    不清楚您是否只想匹配名称,或者名称​​和等级。无论哪种方式,您都需要一个循环来搜索可能性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-13
      • 2019-04-09
      • 2020-09-06
      • 2021-01-15
      • 2016-05-10
      • 2021-05-19
      • 2016-09-03
      • 2023-04-04
      相关资源
      最近更新 更多