[英]python: create list of combinations from two other lists
我有以下兩個列表:
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)
我問的原因是出於優化方面的考慮:用例中的前兩個列表在某些情況下可能很大。
我們能不能增加顯着(在我們構建不同的時間復雜度的算法的意義上),因為目前的算法已經在輸出字典運行的數量,並且不能建立在不到Ø(K k個元素的列表) 。
但是,我們可以使用例如列表理解和更有效的字典構造來提高性能:
[{**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
通常,在處理大量輸入時,最好使用generator ,因為這意味着我們從不構造完整的元素列表,而僅在需要時才計算下一個元素。 好處是雙重的:萬一我們減少了對生成器的迭代,就不會在計算從未使用過的字典上浪費時間,而且,我們節省了內存,因為如果不再使用舊字典,那么它將占用內存可以重復使用。 缺點是,如果所有元素都被枚舉,則生成器協議會浪費一些開銷。 通過使用圓括號()
而不是方括號[]
,我們可以輕松地將列表理解變成生成器:
({**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()
對於較小的數據集,熊貓通常工作得較慢,但如果集合更大,通常會大大提高速度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.