2010-08-06 17 views
9

Con gli elenchi dei dizionari come il seguente:Come unire gli elenchi dei dizionari

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

Qual è il modo migliore per combinare nel seguente elenco di dizionari:

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 
] 

o sarebbe è meglio memorizzare i dati in modo diverso, ad esempio:

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

Grazie per il vostro aiuto.

+0

ho accettato la risposta di Adam come fa esattamente quello che ho bisogno. Le altre risposte - suggerendo di ristrutturare i dati come dizionari - funzionano bene, ma per il mio progetto preferirei non utilizzare id come chiavi. – Chris

risposta

17

Ecco una possibile soluzione:

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

produce:

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

Come potete vedere, ho usato un dizionario ('unito') a metà strada. Naturalmente, puoi saltare un passaggio memorizzando i dati in modo diverso, ma dipende anche dagli altri usi che potresti avere per quelle variabili.

Tutto il meglio.

+0

Perfetto. Grazie mille. – Chris

+0

Hey Adam. Sto usando questo metodo per realizzare lo stesso, ma i miei dotti e le liste sono enormi. Mi chiedo se sapresti un modo più veloce per farlo. Grazie. –

3

dizionario è fondamentalmente un elenco di coppie (chiave, valore).

nel tuo caso,

user_course_score può essere solo un dizionario di (course_id, punteggio), piuttosto che un elenco di dizionari (si sta solo complicare inutilmente)

allo stesso modo, ovviamente può essere solo un dizionario di (course_id, nome)

quello che hai suggerito alla fine è il modo giusto :)

2

Rahul è corretta; un elenco di dizionari non è il modo giusto per farlo. Pensaci in questo modo: i dizionari sono mappature tra pezzi di dati. Il tuo ultimo esempio, courses, è il modo giusto per archiviare i dati; si potrebbe poi fare qualcosa di simile per memorizzare i dati per utente:

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

Si potrebbe anche provare:

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

:)

Problemi correlati