Как объединить списки словарей

Со списками словарей, такими как:

user_course_score = [ {'course_id': 1456, 'score': 56}, {'course_id': 316, 'score': 71} ] courses = [ {'course_id': 1456, 'name': 'History'}, {'course_id': 316, 'name': 'Science'}, {'course_id': 926, 'name': 'Geography'} ] 

Каков наилучший способ объединить их в следующий список словарей:

 user_course_information = [ {'course_id': 1456, 'score': 56, 'name': 'History'}, {'course_id': 316, 'score': 71, 'name': 'Science'}, {'course_id': 926, 'name': 'Geography'} # Note: the student did not take this test ] 

Или было бы лучше хранить данные по-разному, например:

 courses = { '1456': 'History', '316': 'Science', '926': 'Geography' } 

Спасибо за вашу помощь.

4 Solutions collect form web for “Как объединить списки словарей”

Вот возможное решение:

 def merge_lists(l1, l2, key): merged = {} for item in l1+l2: if item[key] in merged: merged[item[key]].update(item) else: merged[item[key]] = item return merged.values() courses = merge_lists(user_course_score, courses, 'course_id') 

Производит:

 [{'course_id': 1456, 'name': 'History', 'score': 56}, {'course_id': 316, 'name': 'Science', 'score': 71}, {'course_id': 926, 'name': 'Geography'}] 

Как вы можете видеть, я использовал словарь («объединенный») как промежуточную точку. Конечно, вы можете пропустить шаг, сохраняя свои данные по-разному, но это зависит также от других применений, которые могут возникнуть для этих переменных.

Всего наилучшего.

словарь – это в основном список пар (ключ, значение).

в твоем случае,

user_course_score может быть просто словарем (course_id, score), а не списком словарей (вы просто не усложняете его)

Аналогично, курс может быть просто словарем (course_id, name)

то, что вы предложили в конце, это правильный путь 🙂

Рахул прав; список словарей – неправильный способ сделать это. Подумайте об этом так: словари – это сопоставления между фрагментами данных. Ваш последний пример, courses , является правильным способом хранения данных; вы можете сделать что-то подобное, чтобы сохранить данные для каждого пользователя:

 courses = { 1456: 'History', 316: 'Science', 926: 'Geography' } # Note the lack of quotes test_scores = { 1456: { <user-id>: <score on History test> }, 316: { <user-id>: <score on History test> }, 926: { <user-id>: <score on History test> } } 

Вы также можете попробовать:

 [ course.update(score) for course in courses for score in user_course_score if course['course_id'] == score['course_id'] ] 

🙂

  • создать 2d-массив в python?
  • Использование аргументов по умолчанию перед позиционными аргументами
  • Python Mechanize + код GAEpython
  • нужно перечислить всех друзей с помощью facebook.py
  • удаление тега из строки в Python
  • Комментируйте блок кода Python
  • как писать или создавать (когда нет) файл с использованием python и Google AppEngine
  • Есть ли способ сделать больше работы после заявления возврата?
  •  
    Interesting Posts for Van-Lav

    Повторить массив NumPy без репликации данных?

    отображает ли google-приложение механизм unicode по-разному в StringProperty v StringListProperty objs?

    Python, Timeout of Try, За исключением утверждения после X секунд?

    Как «с» лучше, чем try / catch, чтобы открыть файл в Python?

    Синтаксис фрагмента списка Python, используемый без видимой причины

    используя win32com.client в python, как найти и заменить несколько текстов

    список расщепления python по ключевому слову

    Ошибка аутентификации Django + Auth0 JWT

    pandas получают среднее значение столбца / среднее значение

    Certbot не может достигнуть nginx webroot работает django

    Получить рабочие дни между датой начала и окончания с использованием панд

    Простая, кросс-платформенная MIDI-библиотека для Python

    pymongo == 3.0.3: ImportError: нет модуля с именем connection

    Python: невозможно объединить объекты str и NoneType

    Tensorflow Slim: TypeError: ожидается int32, получился список, содержащий тензоры типа '_Message' вместо

    Python - лучший язык программирования в мире.