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

时间:2018-10-08 02:34:17

标签: python

我正在使用词典列表:

function a(){
  setTimeout(b, 1000);
  function b(){
    console.log('called');
    alert('b called');
  }
  window.bref = b;
  console.log('finish setting');
}

a();
window.bref = null;
console.log('make b() fail to call')

我需要编写一个函数,该函数按学生姓名搜索字典,以查看是否有匹配的作业名称和年级。如果存在,则返回True,否则返回False,并将其添加到列表中。我已经掌握了什么,但是无论我键入的是true还是false,如果参数读取为false并将赋值添加为元组,则无论如何。

您能帮我找到此功能所需的缺少说明吗?

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

编辑: 第一个答案帮助我使代码正常工作(谢谢!)

现在,我将其放大并变得更整洁,这样就不必将作业添加两次并添加两个不同的等级,而是放置一个已经存在的输出。我制作的东西笨拙且杂乱,似乎修复起来应该很容易,但我无法弄清楚。有什么想法吗?

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)

2 个答案:

答案 0 :(得分:1)

问题在于,对于一​​个学生,"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)

答案 1 :(得分:0)

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

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