2010-08-06 6 views
9

Avec les listes de dictionnaires comme les suivants:Comment fusionner des listes de dictionnaires

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

Quelle est la meilleure façon de les combiner dans la liste suivante des dictionnaires:

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 
] 

Ou serait-il mieux vaut stocker les données différemment, tels que:

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

Merci pour votre aide. Le dictionnaire

+0

J'ai accepté la réponse d'Adam comme il le fait exactement ce que je demande. Les autres réponses - suggérant que je restructure les données en tant que dictionnaires - fonctionnent bien, mais pour mon projet, je préfère ne pas utiliser les identifiants comme clés. – Chris

Répondre

17

Voici une solution possible:

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

Produit:

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

Comme vous pouvez le voir, je un dictionnaire ('fusionné') comme un point à mi-chemin. Bien sûr, vous pouvez passer une étape en stockant vos données différemment, mais cela dépend aussi des autres utilisations que vous pouvez avoir de ces variables.

Tout le meilleur.

+0

Parfait. Merci beaucoup. – Chris

+0

Salut Adam. J'utilise cette méthode pour accomplir la même chose mais mes dicts et listes sont énormes. Je me demande si vous connaissez un moyen plus rapide de le faire. Merci. –

3

est essentiellement une liste de paires (clé, valeur).

dans votre cas,

user_course_score peut juste être un dictionnaire de (course_id, score) plutôt qu'une liste de dictionnaires (vous êtes juste compliquant inutilement)

De même, bien sûr peut être juste un dictionnaire de (course_id, nom)

ce que vous avez suggéré à la fin est la bonne façon :)

2

Rahul est correcte; une liste de dictionnaires n'est pas la bonne façon de le faire. Pensez-y comme ceci: les dictionnaires sont des mappages entre des morceaux de données. Votre dernier exemple, courses, est la bonne façon de stocker les données; vous pourriez faire quelque chose comme ceci pour stocker le par utilisateur des données:

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

Vous pouvez également essayer:

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

:)

Questions connexes