将嵌套列表简化为笛卡尔乘积

2024-04-26 23:28:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python中有一个嵌套列表:

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

我需要一个函数,它将返回一个具有笛卡尔积的列表。好吧,我认为笛卡尔积不是一个正确的词,但从逻辑上来说,结果会是:

^{pr2}$

一个有递归或没有递归的函数都是受欢迎的。在


Tags: lambda函数alpha列表逻辑betadeltagamma
3条回答

将所有项目转换为列表后,可以使用^{}

>>> 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')]

使用^{},这将要求您稍微修改输入('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') 

在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那么简单,但是实现库偶尔使用的逻辑还是很有趣的。在

相关问题 更多 >