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增强)是完美的。也显著提高了可读性。谢谢