2010-08-06 3 views
9

Со списками словарей, таких как:Как объединить списки словарей

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

Благодарим за помощь.

+0

Я принял ответ Адама, как это делает именно то, что я требую. Другие ответы - предлагая мне реструктурировать данные как словари - работают отлично, но для моего проекта я бы предпочел не использовать ids в качестве ключей. – Chris

ответ

17

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

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

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

Все самое лучшее.

+0

Отлично. Огромное спасибо. – Chris

+0

Эй, Адам. Я использую этот метод для достижения того же, но мои дикты и списки огромны. Мне интересно, знаете ли вы более быстрый способ сделать это. Благодарю. –

3

словарь в основном представляет собой список (ключ, значение).

в вашем случае,

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

так же, конечно, может быть просто словарь из (course_id, имя)

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

2

Рахул правильно; список словарей - неправильный способ сделать это. Подумайте об этом так: словари - это сопоставления между фрагментами данных. Ваш последний пример, 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> } 
} 
0

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

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

:)

Смежные вопросы