2016-03-02 53 views
0

所以我在Python類型的字典2所列出如下:合併類型的字典的2列出了基於共同價值觀

list1 = [ 
{ 
    "medication_name": "Actemra IV", 
    "growth": 0, 
    "total_prescriptions": 3 
}, 
{ 
    "medication_name": "Actemra SC", 
    "growth": 0.0, 
    "total_prescriptions": 2 
}, 
{ 
    "medication_name": "Adempas", 
    "growth": 0, 
    "total_prescriptions": 1 
} 
] 

list2 = [ 
{ 
    "medication_name": "Actemra IV", 
    "fulfillment_time": 94340 
}, 
{ 
    "medication_name": "Actemra SC", 
    "fulfillment_time": 151800 
}, 
{ 
    "medication_name": "Adempas", 
    "fulfillment_time": 156660 
} 
] 

我想的是讓列表1與list2中的fulfillment_time關鍵追加,使輸出如下:

[ 
{ 
    "medication_name": "Actemra IV", 
    "growth": 0, 
    "fulfillment_time": 94340, 
    "total_prescriptions": 3 
}, 
{ 
    "medication_name": "Actemra SC", 
    "growth": 0.0, 
    "fulfillment_time": 151800, 
    "total_prescriptions": 2 
}, 
{ 
    "medication_name": "Adempas", 
    "growth": 0, 
    "fulfillment_time": 156660, 
    "total_prescriptions": 1 
} 
] 

我在遍歷兩個列表的傳統方式實現了這一如下:

for i in list1: 
    for j in list2: 
     if i['medication_name'] == j['medication_name']: 
      i['fulfillment_time'] = j['fulfillment_time'] 

我想知道的是,Python中是否有內置的一行函數可以執行我可能不知道的相同任務?

回答

2

沒有「一條線」的方式來做你想做的事情,主要是因爲它不是一個非常自然的操作:你使用的數據結構並不自然地允許你想做的操作。這也可以通過您的算法效率低下這一事實得到證實:對於list1的每個元素,它都一直循環遍歷list2。它是元素數量的二次方。

看起來好像你在考慮將'medication_name'作爲列表中字典的關鍵。但是列表類型不提供通過該鍵查找元素的操作。

更爲pythonic的方法是將列表轉換爲字典:然後找到正確的字典將成爲O(1)。像這樣:

d = { i['medication_name'] : i for i in list2} 
for i in list1: 
    i.update(d[i['medication_name']]) 

Python確實提供了一個單線程來合併字典,如圖所示。

如果list2不包含list1中的某個條目,那麼這會引發您想要執行的操作的問題:可以使用try/except來處理該問題。

這些數據結構有點「像數據庫一樣」。也許你應該使用sqlite3

+0

謝謝..這是相當豐富.. – Amistad