Python 比较两个单独的字典值
我是Python新手,希望了解如何正确地编写代码。我有两个字典列表,我试图找出学生ID是否存在于可以包含学生ID和其他信息的字符串中。我糟糕的方法是:Python 比较两个单独的字典值,python,list,dictionary,Python,List,Dictionary,我是Python新手,希望了解如何正确地编写代码。我有两个字典列表,我试图找出学生ID是否存在于可以包含学生ID和其他信息的字符串中。我糟糕的方法是: confirmed_students = [{'div_school_id': 'as-dh23d7ashdh'}, {'div_school_id': 'asdas-3sdfasd'}, {'div_school_id': 'i4-d9asjcg'}] students = [{'student_id': 'dh23d7ashdh','na
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']})
正确的方法是什么?我是否应该在同一个循环中反复浏览DICT
已确认学生的列表?我只需要知道名为students
的dict列表中的students\u id
是否存在于名为confirmed\u students
的dict列表中,并添加相关信息。达到目的的强力方法(可能不是最有效的)是在两个列表上循环。检查学生的每个要素是否在确认的学生中
首先,你需要知道学生是否在已确认的学生名单中。必须有一把钥匙来匹配。查看您的数据,似乎确认的学生有div\u school\u id,这是学生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
达到这一点的一种蛮力方式(可能不是最有效的)是在两个列表上循环。检查学生的每个要素是否在确认的学生中
首先,你需要知道学生是否在已确认的学生名单中。必须有一把钥匙来匹配。查看您的数据,似乎确认的学生有div\u school\u id,这是学生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
您可以使用列表理解功能构建列表:
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作为键将student定义为字典(假设它是唯一的,应该是唯一的)。这将使执行您想要的比较变得更加容易。您可以使用列表理解功能构建列表:
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作为键将student定义为字典(假设它是唯一的,应该是唯一的)。这将使你更容易进行你想要的比较。确认的学生看起来像:[{'div_school_id':'as-dh23d7ashdh',{div_school_id':'asdas-3sdfasd',{div_school_id':'i4-d9asjcg'),而学生看起来像:[{'student_id':'dh23d7ashdh','name':'First Last','stude','4',{'student_id':'3sdfasd','name':…}]@eod请在问题本身中添加已确认的学生
格式。听写之间似乎没有匹配的键?可能更容易使包含相同div\u school\u id
的词典列表首先只包含id。没有匹配的键。我可以将div\u school\u\u id
列表更改为仅包含id我也相信简单的列表。确认的学生看起来像:[{'div_school_id':'as-dh23d7ashd',{div_school_id':'asdas-3sdfasd',{div school_id':'i4-d9asjcg'],而学生看起来像:[{'student_id':'dh23d7ashd','name':'First Last','student_grade':'4','student"id':'3asd','@eod请在问题本身中添加已确认的学生
格式。听写之间似乎没有匹配的键?可能更容易使包含相同div\u school\u id
的词典列表首先只包含id。没有匹配的键。我可以将div\u school\u\u id
列表更改为仅包含id我也相信简单的列表。一旦找到这样的匹配项,你就需要打破,并将其添加到坏列表中。是的。刚刚看到。需要打破内部循环。谢谢你的反馈!我复制了你的建议,但结果是0。这是因为=
正在寻找一个精确的匹配项吗?我也知道ed在
中,而不在
中,但是坏列表
的元素数与学生的相同
:print(len(students))1713 print(len(bad_list))1713我将根据您对问题的编辑更新此答案如果您的所有学生都是已确认的学生,则您的坏名单长度可能相同。您需要两个名单不同的测试数据,然后我们可以看到哪里出错,您需要在找到匹配项并添加到坏名单
。yes、 刚刚看到。需要打破内部循环。谢谢你的反馈!我复制了你的建议,但是结果是0。这是因为=
正在寻找精确匹配吗?我也尝试了中的和中的而不是,但是坏列表
的元素数与学生相同代码>:打印(len(学生))1713打印(len(坏名单))1713我将根据您对问题的编辑更新此答案如果您的所有学生都是已确认的学生,则您的错误列表长度可能相同。您需要两个列表不同的测试数据,然后我们可以看到哪里出错谢谢!这是否需要一个以学生ID为键的嵌套词典?我尝试了您的建议s只是收到了错误KeyError:“i”
。谢谢!这是否需要一个以学生ID为键的嵌套词典?我尝试了你的建议,但收到了错误KeyError:“i”
。