簡體   English   中英

簡化嵌套列表作為笛卡爾積

[英]Simplifying nested-lists as a Cartesian product

我在Python中有一個嵌套列表,如下所示:

lst = ['alpha', ['beta', 'gamma'], ['delta', 'peta', 'lambda']]

我需要一個函數,該函數將返回具有笛卡爾乘積的列表。 好吧,我認為笛卡爾積不是一個正確的詞,但仍然以合乎邏輯的方式使結果看起來像:

final_lst = your_magical_function(lst)
print final_lst

'''
[['alpha','beta','delta'],
['alpha','beta','peta'],
['alpha','beta','lambda'],
['alpha','gamma','delta'],
['alpha','gamma','peta']
['alpha','gamma','lambda']]
'''

帶有遞歸或不帶有遞歸的函數均受歡迎。

使用itertools.product ,這將需要您稍微修改輸入( 'alpha'['alpha'] ):

from itertools import product

lst = [['alpha'],['beta','gamma'],['delta','peta','lambda']]

for res in product(*lst):
    print(res)

>> ('alpha', 'beta', 'delta')

('alpha', 'beta', 'peta')
('alpha', 'beta', 'lambda')
('alpha', 'gamma', 'delta')
('alpha', 'gamma', 'peta')
('alpha', 'gamma', 'lambda') 

將所有項目轉換為列表后,即可使用itertools.product

>>> from itertools import product
>>> lst = ['alpha',['beta','gamma'],['delta','peta','lambda']]
>>> list(product(*(x if isinstance(x, list) else [x] for x in lst)))
[('alpha', 'beta', 'delta'), ('alpha', 'beta', 'peta'), ('alpha', 'beta', 'lambda'), ('alpha', 'gamma', 'delta'), ('alpha', 'gamma', 'peta'), ('alpha', 'gamma', 'lambda')]

在Python中使用庫真是太好了! 但是,如果您正在尋找純Python實現:

def CartesianProduct(list_entry):
# Save Sizes of Everything
size_dictionary = {}

# Get Size of Entire Entry List
size_dictionary["full_size"] = len(list_entry)

# Get Sizes of All Sub Entries
for i in range(len(list_entry)):
    if not (isinstance(list_entry[i],list)):
        list_entry[i] = [list_entry[i]]
    size_dictionary[i] = len(list_entry[i])

# Now lets create the cartesian product
# Lets Create a Dictionary to hold all of the results
cartesian_result = {}

# Lets get the size of the final result
final_result_amount = 1
for i in range(size_dictionary["full_size"]):
    final_result_amount = final_result_amount * size_dictionary[i]

# And create the final results
for i in range(final_result_amount):
    cartesian_result[i] = []

    for j in range(size_dictionary["full_size"]):
        cartesian_result[i].append(list_entry[j][i % size_dictionary[j]])

    print(cartesian_result[i])

def main():
    lst = ['alpha',['beta','gamma'],['delta','peta','lambda']]
    CartesianProduct(lst)

main()

它不像使用itertools那樣漂亮和簡單,但是實現庫偶爾使用的邏輯還是很有趣的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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