根据常见值合并2个dicts列表

时间:2016-03-02 20:42:46

标签: list python-2.7 dictionary

所以我在Python中有两个dicts列表如下:

try { expression; } 
catch (const exception_type&) { SUCCEED("yay"); return; }
catch (...) { FAIL("wrong exception type"); return; }
FAIL("no exception");

我想要的是将list1附加list2中的fulfillment_time键,以便输出如下:

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

我通过循环遍历两个列表的方式实现了这一点,如下所示:

[
{
    "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
}
]

我想知道的是,python中是否有任何内置的一行函数执行我可能不知道的相同任务?

1 个答案:

答案 0 :(得分:2)

没有“一线”的方式来做你想要的,主要是因为它不是一个非常自然的操作:你使用的数据结构自然不允许你想要做的操作。您的算法效率相当低,这也证明了这一点:它为list2的每个元素一直循环list1。它是元素数量的二次方。

您似乎在考虑'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