2010-08-06 84 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

我已經接受了亞當的答案,因爲它不正是我需要。其他答案 - 建議我將數據重組爲字典 - 工作正常,但對於我的項目,我寧願不使用ID作爲鍵。 – Chris 2010-08-06 09:48:52

回答

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 2010-08-06 09:47:17

+0

嘿亞當。我使用這種方法來完成相同的工作,但是我的字典和列表非常龐大。我想知道如果你知道更快的方法來做到這一點。謝謝。 – 2011-12-05 12:00:43

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

:)