簡體   English   中英

python:從另外兩個列表創建組合列表

[英]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個元素的列表

香草 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

使用生成器而不是列表

通常,在處理大量輸入時,最好使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM