为什么';这是Python工作中修改过的笛卡尔积函数吗?
理想情况下,输入为[1,2],输出为所有组合[[1,1]、[2,2]、[1,2]、[2,1]]。基本上,打印所有可能的替换组合为什么';这是Python工作中修改过的笛卡尔积函数吗?,python,product,cartesian,Python,Product,Cartesian,理想情况下,输入为[1,2],输出为所有组合[[1,1]、[2,2]、[1,2]、[2,1]]。基本上,打印所有可能的替换组合 def cart(lst): if lst == []: return [[]] return [x[i:] + [lst[0]] + x[:i] for x in cart(lst[1:]) for i in range(len(x)) ] l = [1,2,3] print cart(l) 返回 [] 以更易于理解的形式,代码基本上说
def cart(lst):
if lst == []:
return [[]]
return [x[i:] + [lst[0]] + x[:i] for x in cart(lst[1:]) for i in range(len(x)) ]
l = [1,2,3]
print cart(l)
返回
[]
以更易于理解的形式,代码基本上说:
for x in cart(lst[1:]):
for i in range(len(x)):
return x[i:] + [lst[0]] + x[:i]
如果我们假设递归情况下输入[1,2,3]
,那么
cart([2,3])
应该产生[[2,3],[3,2],[2,2],[3,3]]
,因此对于递归步骤,我们希望在每个可能的位置插入1
。(此代码可能缺少111
案例。)
代码看起来逻辑正确,但输出空字符串
是否有遗漏或我处理问题的方法不正确
编辑
实际上,我意识到代码会稍微复杂一些:
def cart(lst):
if len(lst) <= 1:
return lst
else:
return [x[i:] + [lst[j]] + x[:i] for x in cart(lst[1:]) for j in range(len(lst)) for i in range(len(x))]
def购物车(lst):
如果len(lst)在这里找到了答案
看来我是在尝试列表本身的递归情况,而不是组合的大小
我想知道这个解决方案是否可以通过在列表中重复出现而不是组合的大小来实现。如果您找到了问题的答案,请将其作为答案发布并接受。它对每个人都有好处。所以你想实现itertools.product吗?在这种情况下,你可以在中学习一个,那里有一个纯python版本,你可以使用它或它的一些变体来适合你的口味
def cart(lst):
if len(lst) <= 1:
return [lst]
else:
return [x[i:] + [lst[j]] + x[:i] for x in cart(lst[1:]) for j in range(len(lst)) for i in range(len(x))]
l = [1,2,3]
print cart(l)
def permutations_with_replacement(k,n):
# special case (not part of recursion)
if k == 0:
return []
if k == 1:
return [[n[i]] for i in range(len(n))]
else:
# Make the list by sticking the k-1 permutations onto each number
# we can select here at level k
result = []
# Only call the k-1 case once, though we need it's output n times.
k_take_one_permutations = permutations_with_replacement(k-1,n)
for i in range(len(n)):
for permutation in k_take_one_permutations:
result.append([n[i]]+permutation)
return result
print permutations_with_replacement(3,2)
print permutations_with_replacement(3, [1,2,3])