Python 置换码don';我不能给出正确的结果 我写了一些函数来输出一个列表的排列,我给出了一个输入:[1 ],它应该输出[[]][],但是我的代码输出:[[]],我尝试打印日志,看起来像在代码运行的中间,它确实打印输出[[ 1 ] ],但不知道为什么它最终输出[[]]?如何修复它?有人能帮忙吗?非常感谢
哦,你让自己很难过 在Python 置换码don';我不能给出正确的结果 我写了一些函数来输出一个列表的排列,我给出了一个输入:[1 ],它应该输出[[]][],但是我的代码输出:[[]],我尝试打印日志,看起来像在代码运行的中间,它确实打印输出[[ 1 ] ],但不知道为什么它最终输出[[]]?如何修复它?有人能帮忙吗?非常感谢,python,algorithm,permutation,Python,Algorithm,Permutation,哦,你让自己很难过 在dfs内部,您正在调用dfs,如下所示: dfs(nums, visited, tmp, result) result.append(tmp) result.append(list(tmp)) 然后,在第二次迭代中,将tmp添加到result中,如下所示: dfs(nums, visited, tmp, result) result.append(tmp) result.append(list(tmp)) 然后,返回后,使用以下命令从tmp中删除1: tmp.p
dfs
内部,您正在调用dfs
,如下所示:
dfs(nums, visited, tmp, result)
result.append(tmp)
result.append(list(tmp))
然后,在第二次迭代中,将tmp
添加到result
中,如下所示:
dfs(nums, visited, tmp, result)
result.append(tmp)
result.append(list(tmp))
然后,返回后,使用以下命令从tmp
中删除1
:
tmp.pop()
这会将其从tmp
中删除,但由于您也将列表tmp
添加到result
,您现在已经将result
从[[1]]
更改为[[]]
-毕竟它是tmp
你应该重新考虑这里到底需要什么。在Python中,通过引用传递变量并修改它们的内容并不是一个很好的方法。试着从功能上考虑,不要依赖副作用
如果我给出的答案听起来很复杂,那是因为您为Python中的一个简单问题创建了一个相当复杂的解决方案。例如,这里有一个更简单的解决方案:
def permutations(xs):
if len(xs) < 2:
yield xs
else:
for n in range(len(xs)):
for continuation in permutations(xs[:n] + xs[n+1:]):
yield [xs[n]] + continuation
print(list(permutations([1,2,3,4])))
顺便说一下,您可以像这样修复代码:
dfs(nums, visited, tmp, result)
result.append(tmp)
result.append(list(tmp))
这将创建一个副本,而不是添加
tmp
本身。但是,一旦您尝试使用较长列表的代码,例如[1,2]
,您将遇到更多的错误,我还没有完全调试解决方案。如果您关心实现细节,请查看由给出的答案。此外,看看答案,作者解释了计算数字列表排列的两种方法
但是,如果您只想用简洁的代码回答问题,请使用内置的itertools模块
import itertools
def permute(nums):
# the permutation function returns itertools.permutations object
result = itertools.permutations(nums)
# convert the object to your desired format
result = [list(i) for i in result]
return result
# call the function
a = [1]
result = permute(a)
print(result)
这应该表明,
[[1]]
您已将
tmp
添加到result
中,然后从tmp
中弹出项目,这会影响结果变量再次变为空白。感谢您的澄清!不客气-如果你觉得答案足够,请接受它,这样其他人就知道这个问题不再需要答案,而其他寻找答案的人可以更容易地找到它。