比较两个单独的字典值

问题描述 投票:0回答:2

我是新来的Python和希望找出如何正确代码这一点。我有字典的两份名单,我试图找到如果可以包含学生ID等信息的字符串存在的学生证。我的厉害形成方法:

confirmed_students = [{'div_school_id': 'as-dh23d7ashdh'}, {'div_school_id': 'asdas-3sdfasd'}, {'div_school_id': 'i4-d9asjcg'}] 

students = [{'student_id': 'dh23d7ashdh','name': 'First Last','student_grade': '4'}, {'student_id':'3sdfasd', 'name':...}] 

bad_list = []
for student in students:
    if student['student_id'] not in confirmed_students:
        bad_list.append({"id": student['student_id'], "name": student['name'], "grade": student['student_grade']})

什么是这样做的正确方法?我应该通过http://stardict.sourceforge.net/Dictionaries.php下载列表迭代confirmed_students在同一个循环?我只需要知道,如果从类型的字典称为student_id列表中students在http://stardict.sourceforge.net/Dictionaries.php下载名为confirmed_students名单都存在,并添加相关信息。

python list dictionary
2个回答
1
投票

您可以使用列表解析生成列表:

bad_list = [{k: student[v] for k, v in zip(('id', 'name', 'grade'), ('student_id', 'name', 'student_grade'))} for student in students if student['student_id'] not in confirmed_students]

旁注:我建议你使用student_id数据作为关键定义学生字典(假设它是独一无二的,它应该)。这将使它更容易执行像你想的一个比较。


1
投票

到达那里(也可能不是最有效)的蛮力的方法是遍历两个列表。检查学生的每一个元素是confirmed_students。

首先,你需要知道,如果学生是在confirmed_students列表的方式。必须有匹配的关键。看着你的数据看来,如果confirmed_students已div_school_id是某种的student_id数据和一些前缀的复合材料。

# looking at one confirmed student as an example
confirmed_student = confirmed_students[0]
# confirmed_student = {'div_school_id': 'as-dh23d7ashdh'}
# we need to split the id on the '-' and keep the last part
confirmed_student_id = confirmed_student['div_school_id'].split("-")[1]
# gives us confirmed_student_id as 'dh23d7ashdh' which looks right?

# now we loop over your students and see if their id is in confirmed_students
bad_list = []
for student in students:
    for confirmed_student in confirmed_students:
        confirmed_student_id = confirmed_student['div_school_id'].split("-")[1]
        if student["student_id"] == confirmed_student_id:
            bad_list.append({"id": student['student_id'], "name": student['name'], "grade": student.get('student_grade', '')})
            # break from the inner loop and continue the outer loop
            # because we only need the first match
            break
© www.soinside.com 2019 - 2024. All rights reserved.