我想编写一个递归代码,找到所有要选择的选项,重复列表中的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]]
如何修复我的代码?
任何帮助表示感谢。
答案 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 = []
,因为它已在下一行分配