gpt4 book ai didi

python - 排列代码不能给出正确的结果

转载 作者:行者123 更新时间:2023-12-01 06:27:25 31 4
gpt4 key购买 nike

我写了一些函数来输出列表的排列,我给出了一个输入:[1],它应该输出[[1]],但我的代码输出:[[]],我尝试过打印日志,看起来在代码运行的中间它打印了[[1]],但不确定为什么最后它输出[[]]?以及如何修复它?有人可以帮忙吗?非常感谢!

<小时/>
def permute(nums):
result=[]
visited=[False]*len(nums)
nums=sorted(nums)
dfs(nums, visited, [], result)
return result

def dfs(nums, visited, tmp, result):

if len(tmp)==len(nums):
result.append(tmp)
print(result) ##here it shows correctly [[1]]
return

for i in range(len(nums)):
if visited[i]:
continue

if i>0 and tmp[i]==tmp[i-1] and not visited[i-1]:
continue

tmp.append(nums[i])
visited[i]=True
dfs(nums, visited, tmp, result)
visited[i]=False
tmp.pop()


a=[1]
result=permute(a)
print("------")
print(result)

最佳答案

哦,你让自己变得很艰难......

dfs内部,您像这样调用dfs:

dfs(nums, visited, tmp, result)

然后,在第二次迭代中,您将 tmp 添加到 result 中,如下所示:

result.append(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])))

别介意这个:

from itertools import permutations

print(list(permutations([1,2,3,4])))

顺便说一句,您可以像这样修复代码:

result.append(list(tmp))

这将创建一个副本,而不是添加 tmp 本身。但是,一旦您尝试使用更长的列表(例如 [1,2])的代码,您将遇到更多错误,并且我还没有考虑完全调试解决方案。

关于python - 排列代码不能给出正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60068915/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com