【问题标题】:python combination of k size from n size list (recursive)来自n大小列表的k大小的python组合(递归)
【发布时间】:2016-01-07 19:41:19
【问题描述】:

我需要一个递归函数,它可以对给定列表和长度进行所有可能的排列,并带有替换:

>>> rec_offspring(3,[2,3])
[[2, 2, 2], [3, 2, 2], [2, 3, 2], [3, 3, 2], [2, 2, 3], [3, 2, 3], [2, 3, 3], [3, 3, 3]]

我找到了下面的代码,但它只给出了组合;它不会重复一个元素,例如 [222] [322] 等。

def choose_sets(mylist,length):
    mylen = len(mylist)

    if length == 1:
        return [[i] for i in mylist]
    if length > mylen:
        return []

    ToRet = []
    for k in xrange(mylen): 
        if mylen - k + 1> length :
            for j in choose_sets(mylist[k+1:],length-1):
                New = [mylist[k]]
                New.extend(j)
                ToRet.append(New)
    return ToRet
print choose_sets([1,2,3,4,5],3)

【问题讨论】:

  • 你在做矩阵乘法吗?
  • 您尝试过 itertools.product([2,3], repeat=3) 吗?

标签: python recursion combinations permutation


【解决方案1】:

这称为笛卡尔积。你可以使用itertoolsmodule

>>> from itertools import product
>>> list(product([2,3], repeat=3))
[(2, 2, 2), (2, 2, 3), (2, 3, 2), (2, 3, 3), (3, 2, 2), (3, 2, 3), (3, 3, 2), (3, 3, 3)]

【讨论】:

  • 谢谢我发现但我需要一个递归代码,这是老师的分配
  • 如果是家庭作业,那你应该自己做,你不觉得吗?这不是一个解决家庭作业的地方,而是从你尝试过但没有用的地方回答问题。
【解决方案2】:

你有三个基本问题:

(1) 在您的递归调用中,您切断了所选元素。相反,将它们全部传递到下一个级别。替换

for j in choose_sets(mylist[k+1:],length-1):

for j in choose_sets(mylist,length-1):

(2) 您限制了要考虑的元素数量,使得元素处于非递减顺序。删除线

    if mylen - k + 1> length:

(3) 最后,您将返回列表限制为输入列表的长度。这意味着只有 2 个元素(例如 [2, 3]),您不能返回包含 3 个元素的选择列表(例如 [2, 3, 2])。删除违规代码:

if length > mylen:
    return []

生成的程序似乎在执行您想要的操作,并返回:

>>> print choose_sets([2,3], 3)
[[2, 2, 2], [2, 2, 3], [2, 3, 2], [2, 3, 3], [3, 2, 2], [3, 2, 3], [3, 3, 2], [3, 3, 3]]
>>> print choose_sets([1,2,3,4,5], 3)
[[1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 1, 4], [1, 1, 5], [1, 2, 1], [1, 2, 2], [1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 3, 1], [1, 3, 2], [1, 3, 3], [1, 3, 4], [1, 3, 5], [1, 4, 1], [1, 4, 2], [1, 4, 3], [1, 4, 4], [1, 4, 5], [1, 5, 1], [1, 5, 2], [1, 5, 3], [1, 5, 4], [1, 5, 5], [2, 1, 1], [2, 1, 2], [2, 1, 3], [2, 1, 4], [2, 1, 5], [2, 2, 1], [2, 2, 2], [2, 2, 3], [2, 2, 4], [2, 2, 5], [2, 3, 1], [2, 3, 2], [2, 3, 3], [2, 3, 4], [2, 3, 5], [2, 4, 1], [2, 4, 2], [2, 4, 3], [2, 4, 4], [2, 4, 5], [2, 5, 1], [2, 5, 2], [2, 5, 3], [2, 5, 4], [2, 5, 5], [3, 1, 1], [3, 1, 2], [3, 1, 3], [3, 1, 4], [3, 1, 5], [3, 2, 1], [3, 2, 2], [3, 2, 3], [3, 2, 4], [3, 2, 5], [3, 3, 1], [3, 3, 2], [3, 3, 3], [3, 3, 4], [3, 3, 5], [3, 4, 1], [3, 4, 2], [3, 4, 3], [3, 4, 4], [3, 4, 5], [3, 5, 1], [3, 5, 2], [3, 5, 3], [3, 5, 4], [3, 5, 5], [4, 1, 1], [4, 1, 2], [4, 1, 3], [4, 1, 4], [4, 1, 5], [4, 2, 1], [4, 2, 2], [4, 2, 3], [4, 2, 4], [4, 2, 5], [4, 3, 1], [4, 3, 2], [4, 3, 3], [4, 3, 4], [4, 3, 5], [4, 4, 1], [4, 4, 2], [4, 4, 3], [4, 4, 4], [4, 4, 5], [4, 5, 1], [4, 5, 2], [4, 5, 3], [4, 5, 4], [4, 5, 5], [5, 1, 1], [5, 1, 2], [5, 1, 3], [5, 1, 4], [5, 1, 5], [5, 2, 1], [5, 2, 2], [5, 2, 3], [5, 2, 4], [5, 2, 5], [5, 3, 1], [5, 3, 2], [5, 3, 3], [5, 3, 4], [5, 3, 5], [5, 4, 1], [5, 4, 2], [5, 4, 3], [5, 4, 4], [5, 4, 5], [5, 5, 1], [5, 5, 2], [5, 5, 3], [5, 5, 4], [5, 5, 5]]

【讨论】:

  • 不客气。记得给好的答案投票,到时候选择你最喜欢的。
  • 你是最喜欢的,这个网站肯定很棒
猜你喜欢
  • 2018-11-11
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多