我正在编写一个排列函数,用于在Python中生成列表的所有排列。我的问题是为什么这样做:
def permute(inputData, outputSoFar):
for elem in inputData:
if elem not in outputSoFar:
outputSoFar.append(elem)
if len(outputSoFar) == len(inputData):
print outputSoFar
else:
permute(inputData, outputSoFar) # --- Recursion
outputSoFar.pop()
permute([1,2,3],[])
但这不是:
def permute(inputData, outputSoFar):
for elem in inputData:
if elem not in outputSoFar:
outputSoFar.append(elem)
if len(outputSoFar) == len(inputData):
yield outputSoFar
else:
permute(inputData, outputSoFar) # --- Recursion
outputSoFar.pop()
for i in permute([1,2,3], []):
print i
这也不起作用(产生列表的副本):
def permute(inputData, outputSoFar):
for elem in inputData:
if elem not in outputSoFar:
outputSoFar.append(elem)
if len(outputSoFar) == len(inputData):
yield outputSoFar[:] # --- Copy of the list
else:
permute(inputData, outputSoFar) # --- Recursion
outputSoFar.pop()
for i in permute([1,2,3], []):
print i
答案 0 :(得分:3)
您还必须产生递归调用的结果:
def permute(inputData, outputSoFar):
for a in inputData:
if a not in outputSoFar:
if len(outputSoFar) == len(inputData) - 1:
yield outputSoFar + [a]
else:
for b in permute(inputData, outputSoFar + [a]): # --- Recursion
yield b
for i in permute([1,2,3], []):
print i
...或(更接近OP代码):
def permute(inputData, outputSoFar):
for elem in inputData:
if elem not in outputSoFar:
outputSoFar.append(elem)
if len(outputSoFar) == len(inputData):
yield outputSoFar
else:
for permutation in permute(inputData, outputSoFar):
yield permutation # --- Recursion
outputSoFar.pop()
for i in permute([1,2,3], []):
print i
答案 1 :(得分:0)
当你弹出流行音乐时,你正在破坏性地丢失物品。使用列表的副本而不是就地改变它。
或者,请改用itertools.permutations
或itertools.combinations
。