将嵌套列表简化为笛卡尔积
Simplifying nested-lists as a Cartesian product
我在 Python 中有一个嵌套列表:
lst = ['alpha', ['beta', 'gamma'], ['delta', 'peta', 'lambda']]
我需要一个函数来 return 一个包含它们的笛卡尔积的列表。好吧,我认为笛卡尔积不是一个正确的词,但仍然以合乎逻辑的方式结果看起来像:
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 那样漂亮和简单,但是实现库偶尔使用的逻辑仍然很有趣。
我在 Python 中有一个嵌套列表:
lst = ['alpha', ['beta', 'gamma'], ['delta', 'peta', 'lambda']]
我需要一个函数来 return 一个包含它们的笛卡尔积的列表。好吧,我认为笛卡尔积不是一个正确的词,但仍然以合乎逻辑的方式结果看起来像:
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 那样漂亮和简单,但是实现库偶尔使用的逻辑仍然很有趣。