【问题标题】:Recursively generate combinations with Python使用 Python 递归生成组合
【发布时间】:2013-09-17 10:12:06
【问题描述】:

我正在尝试提供一种递归方法,该方法在给定课程列表时提供所有可能组合的列表。例如 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] 等等。

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

这是作业,所以需要递归方法。

【问题讨论】:

  • 请详细说明您想要完成的任务。示例输出很好,但还不够。并且不要在此处发布您解决问题的尝试。剖析它很分散注意力,也没有乐趣。我认为这可以解释否决票。
  • @ash 实际上我不同意 - 虽然有些人可能会觉得这会分散注意力,但真正尝试解决问题是非常受欢迎的,而且实际上受到社区的鼓励。没有人喜欢“给我代码”的问题......
  • @ash:什么?我认为mattgemmell.com/2008/12/08/what-have-you-tried 是这里的方法吗?
  • 你说服了我。我收回评论的最后一部分。
  • dishes_so_far.append(D) 行之后,打印courses, current_courses, dishes_so_far 以查看其内容,然后再调用recursive_make_orders(dishes_so_far , courses[1:len(courses)])

标签: python python-3.x combinations


【解决方案1】:

您离它不远了 - 使用 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')

【讨论】:

  • 对不起,我应该根据我得到的问题说明需要使用递归方法
  • @JonClements 列表理解可能更 Pythonic ;)[[entree, desert] for entree in Entree for desert in Dessert]
  • @JonClements 没错,虽然如果我没记错的话,itertools 有它自己的问题。
【解决方案2】:

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

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构造新列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-22
    • 2019-04-27
    • 1970-01-01
    • 2021-05-22
    • 2016-05-03
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多