在给定长度的列表元素中查找重复的所有排列

时间:2017-07-24 07:25:57

标签: python python-3.x recursion

我想编写一个递归代码,找到所有要选择的选项,重复列表中的k个元素。代码将返回包含所有选项的列表列表。

我的代码:

def repetitions(elements,k):
    if elements==[]:
        return []
    if k==0:
        return [[]]
    else:
        result=[]
        result = repetitions(elements,k-1)
        for e in result:
            e.append(elements[0])
        result.extend(repetitions(elements[1:],k))
    return result

我的问题是代码没有保留原始列表的顺序。

例如:

repetitions([1,2],3)
[[1, 1, 1], [2, 1, 1], [2, 2, 1], [2, 2, 2]]

而不是:

[[1, 1, 1], [1, 1, 2], [1, 2, 2], [2, 2, 2]]

如何修复我的代码?

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:1)

要获得正确的顺序,只需从开头插入而不是结束:所以替换

e.append(elements[0])

由:

e.insert(0,elements[0])

无论如何,为什么重新发明轮子?只需使用itertools.combinations_with_replacement

import itertools

def repetitions(r,n):
    return list(itertools.combinations_with_replacement(r,n))

print(repetitions([1,2],3))

结果:

[(1, 1, 1), (1, 1, 2), (1, 2, 2), (2, 2, 2)]

(或[list(x) for x in itertools.combinations_with_replacement(r,n)]如果确实需要列表而不是元组列表

小挑剔:

  • if elements==[] => if elements
  • 无需设置result = [],因为它已在下一行分配