python:从另外两个列表创建组合列表
我有以下两个清单:python:从另外两个列表创建组合列表,python,Python,我有以下两个清单: list_of_dicts = [ {'book': 1, 'title': 'novice'}, {'book': 2, 'title': 'novice'}, {'book': 3, 'title': 'novice'}, ] names = ['Johnny', 'Mike'] 我想创建一个字典列表,表示这两个列表的组合,如下所示: data = [ {'book': 1, 'title': 'novice', name='Johnny
list_of_dicts = [
{'book': 1, 'title': 'novice'},
{'book': 2, 'title': 'novice'},
{'book': 3, 'title': 'novice'},
]
names = ['Johnny', 'Mike']
我想创建一个字典列表,表示这两个列表的组合,如下所示:
data = [
{'book': 1, 'title': 'novice', name='Johnny'},
{'book': 1, 'title': 'novice', name='Mike'},
{'book': 2, 'title': 'novice', name='Johnny'},
{'book': 2, 'title': 'novice', name='Mike'},
{'book': 3, 'title': 'novice', name='Johnny'},
{'book': 3, 'title': 'novice', name='Mike'},
]
这就是我目前所拥有的,但应该有更好的方法:
data = []
for d in list_of_dicts:
for name in names:
new_d = d.copy()
new_d['name'] = name
data.append(new_d)
我问的原因是为了优化:在某些情况下,用例中的前两个列表可能非常庞大。关于时间复杂性的说明
我们不能显著地提高它(在这个意义上,我们构造了一个具有不同时间复杂度的算法),因为当前的算法已经在大量的输出字典中运行,并且不能在少于O(k)的时间内构造k个元素的列表
用香草Python增强
但是,我们可以使用例如列表理解和更有效的字典构造来稍微提高性能:
[{**d, 'name': name} for d in list_of_dicts for name in names]
如果我们将其与原始实现进行比较,我们会得到以下基准:
old: 1.611422804009635
new: 1.3899883680278435 (-14%)
基准计划:
>>> def g():
... data = []
... for d in list_of_dicts:
... for name in names:
... new_d = d.copy()
... new_d['name'] = name
... data.append(new_d)
... return data
...
>>> def h():
... return [{**d, 'name': name} for d in list_of_dicts for name in names]
...
>>> timeit.timeit(g)
1.611422804009635
>>> timeit.timeit(h)
1.3899883680278435
使用生成器而不是列表
通常在处理大输入时,最好使用生成器,因为这意味着我们永远不会构造完整的元素列表,而只在需要时计算下一个元素。优点有两个:如果我们更早地停止对生成器的迭代,我们就不会在计算从未使用过的字典上浪费周期,而且我们节省内存,因为如果不再使用旧字典,它占用的内存可以重用。缺点是,如果枚举所有元素,则生成器协议会浪费一些开销。通过使用圆括号()
而不是方括号[]
,我们可以轻松地将列表理解转化为生成器:
({**d, 'name': name} for d in list_of_dicts for name in names)
大熊猫助兴
如果每本字典都包含相同的键,我们也可以使用熊猫。我们可以构造两个数据帧,然后连接它们,如:
from pandas import DataFrame, merge
da = DataFrame(list_of_dicts)
db = DataFrame(names)
da['_tmpkey'] = db['_tmpkey'] = 1
result = merge(da, db, on='_tmpkey').drop('_tmpkey', axis=1).T.to_dict().values()
Pandas通常对小数据集的处理速度较慢,但如果数据集较大,通常会导致显著的加速。您无法对其进行显著优化(不同的时间复杂度)因为它在大量的输出字典中运行。你真的需要一个dict列表还是一个dict生成器就足够了?@Omni我将使用生成的列表
数据相当多,因此非常确定生成器不会工作。第一个选项(使用普通python增强)是完美的。也显著提高了可读性。谢谢