列表列表的python函数n long,每个元素为0-m

时间:2017-03-29 18:52:38

标签: python recursion

我需要创建一个函数,以便我可以输入两个参数,一个order和一个max,并返回所有列表'order'的列表,并且每个元素的范围从0到'max'。我怀疑我可能需要使用递归,但我迷失了。

所以order = 2 max = 3应该返回

[[0,0,0,0], [0,0,0,1], [0,0,0,2], ...  [3,3,3,3]]

和order = 4,max = 5应返回

{{1}}

感谢您的帮助

3 个答案:

答案 0 :(得分:2)

请注意,一般情况下,@ Prune的答案是首选武器。

至于递归:请求列表可以递归构造为

  1. 长度1的列表是所有1的列表 - 包含初始集中元素的元素列表:
  2. [1] -> [[1]]

    [1, 2] -> [[1], [2]]

    [1, 2, 3] -> [[1], [2], [3]]

    在Python中:

    l1 = [[item] for item in range(0, max + 1)]

    1. ln1长度为n + 1的{​​{1}} ln长度为n l1,其中ln1 = [a + b for a in combine(base, n - 1) for b in combine(base, 1)]的元素按列表加入串联。
    2. 在Python中:

      def combinations(base, n): if n == 0: return [] elif n == 1: return [[item] for item in base] else: return [a + b for a in combine(base, n - 1) for b in combine(base, 1)]

      itertools.combinations_with_replacements()

      fom速度更快,内存效率更高。它也是一个现有的轮子,而不是一个新的轮子。

答案 1 :(得分:1)

你不需要递归;您只需要Python itertools包:

import itertools
num_list = [x for x in range(max+1)]

for one_combo in itertools.combinations_with_replacement(num_list, order):
    ...

当然,你可以结合两条计算线;这样看起来更容易。

答案 2 :(得分:1)

这是一个使用递归来解决问题的函数。当你处理递归时,请确保你有一个基本案例和一般情况。

def recurseNumbers(order, mx):
    if order == 1:
        return [[n] for n in range(mx + 1)]
    else:
        total_array = []
        for num in range(mx + 1):
            numbers = recurseNumbers(order - 1, mx)
            for number in numbers:
                total_array.append([num] + number)
        return total_array

另请注意,Python列表添加使这相对简单。 ["a"] + ["b"] = ["a", "b"]