2010-08-06 19 views
9

Con las listas de los diccionarios como el siguiente:Cómo combinar las listas de diccionarios

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

¿Cuál es la mejor manera de combinarlos en la siguiente lista de diccionarios:

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 sería ser mejor para almacenar los datos de manera diferente, como:

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

Gracias por su ayuda.

+0

He aceptado la respuesta de Adán, ya que hace exactamente lo que necesito. Las otras respuestas, sugiriendo que reestructure los datos como diccionarios, funcionan bien, pero para mi proyecto preferiría no usar identificadores como claves. – Chris

Respuesta

17

He aquí una posible solución:

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

Como se puede ver, he usado un diccionario ('fusionado') como un punto intermedio. Por supuesto, puede omitir un paso al almacenar sus datos de manera diferente, pero también depende de los otros usos que pueda tener para esas variables.

Todo lo mejor.

+0

Perfecto. Muchas gracias. – Chris

+0

Hola Adam. Estoy usando este método para lograr lo mismo, pero mis dictados y listas son enormes. Me pregunto si sabrías una manera más rápida de hacer esto. Gracias. –

3

es básicamente una lista de pares (clave, valor).

en su caso,

user_course_score simplemente puede ser un diccionario de (course_id, puntuación) en lugar de una lista de diccionarios (se acaba complicando innecesariamente)

de manera similar, por supuesto puede ser sólo un diccionario de (course_id, nombre)

lo que usted ha sugerido al final es la manera correcta :)

2

Rahul es correcta; una lista de diccionarios no es la forma correcta de hacerlo. Piénselo de esta manera: los diccionarios son asignaciones entre piezas de datos. Su ejemplo final, courses, es la forma correcta de almacenar los datos; A continuación, podría hacer algo como esto para almacenar los datos de cada usuario:

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

También puede probar:

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

:)

Cuestiones relacionadas