所以我在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中是否有任何内置的一行函数执行我可能不知道的相同任务?
答案 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
?