Сравните два отдельных значения словаря - PullRequest
0 голосов
/ 04 февраля 2019

Я новичок в Python и хочу выяснить, как правильно это кодировать.У меня есть два списка словарей, и я пытаюсь найти, существует ли идентификатор студента в строке, которая может содержать идентификатор студента и другую информацию.Мой плохо сформированный подход:

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

Каков был бы правильный способ сделать это?Должен ли я перебирать список диктов confirmed_students в том же цикле?Мне нужно только знать, существует ли вообще student_id из списка диктов students в списке диктов confirmed_students и добавить соответствующую информацию.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Вы можете построить список, используя понимание списка:

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]

Sidenote: Я предлагаю вам определить студентов как словарь, используя student_id в качестве ключа (при условии, что он уникален, что и должно быть).Это значительно упростит сравнение, как вы хотите.

0 голосов
/ 04 февраля 2019

Самый грубый способ добраться (и, возможно, не самый эффективный) состоит в том, чтобы перебрать оба списка.Проверьте, находится ли каждый элемент из студентов в подтвержденных_стадентов .

Во-первых, вам нужен способ узнать, находится ли студент в * 1009Список подтвержденных .Должен быть ключ для совпадения.Глядя на ваши данные, кажется, что Verified_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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...