递归地生成与Python的组合

时间:2013-09-17 10:12:07

标签: python python-3.x combinations

我正在尝试提供一个递归方法,在给定课程列表时提供所有可能组合的列表。 E.g course = [主菜,甜点] 这就是我到目前为止所做的:

Entree = ["pumkinsoup","antipasto"]
Dessert = ["cheesecake", "icecream", "tiramisu", "cheeseplatter"]
courses = [Entree, Dessert]

def make_orders(courses):
    dishes_so_far = []
    recursive_make_orders(dishes_so_far, courses)

def recursive_make_orders(dishes_so_far, courses):
    n = len(courses)
    if n==0 :
        print(dishes_so_far)
    else:
        current_courses = courses[0]

        for D in current_courses:
            dishes_so_far.append(D)
            recursive_make_orders(dishes_so_far , courses[1:len(courses)])

\我正在尝试制作它,以便打印出[[pumkinsoup,cheesecake],[punkinsoup, icecream]]等组合,但它实际上给了我[pumkinsoup, cheesecake, icecream]等等。

尝试添加添加而不是附加,它给了我一个错误。

这是家庭作业,因此需要递归方法。

2 个答案:

答案 0 :(得分:2)

你离我太远 - 使用itertools.product*courses解压缩它:

from itertools import product

for course in product(*courses):
  print course

('pumkinsoup', 'cheesecake')
('pumkinsoup', 'icecream')
('pumkinsoup', 'tiramisu')
('pumkinsoup', 'cheeseplatter')
('antipasto', 'cheesecake')
('antipasto', 'icecream')
('antipasto', 'tiramisu')
('antipasto', 'cheeseplatter')

答案 1 :(得分:1)

如果你想要递归版,你可以这样做:

def worker(entree, dessert):
    d = []
    if not entree or not dessert: return d

    d.append((entree[0], dessert[0]))
    d += worker(entree[1:], dessert)
    d += worker(entree, dessert[1:])
    return d

您的版本无法正常工作,因为courses现在是列表列表,而courses[0]只是Entree,因此您从Entree递归构建新列表。