我正在尝试解决使用以下代码查找给定列表的排列的问题。但是,列表final
不断地添加相同的内容。它应返回[[1,2,3],[2,1,3],[2,3,1],[1,3,2],[3,1,2],[3,2,1]]
,但应返回[[1,2,3],[1,2,3], [1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]
。我已经尝试解决此问题已有一段时间了,非常感谢您的帮助。
class Solution(object):
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
self.final = []
l = 0
r = len(nums) -1
self.permutation(nums, l, r)
return self.final
def permutation(self, nums, l, r):
if l == r:
self.final.append(nums)
# print(nums)
print(self.final)
else:
for i in range(r+1):
nums[l], nums[i] = nums[i], nums[l]
self.permutation(nums, l+1, r)
nums[l], nums[i] = nums[i], nums[l]
A = Solution()
A.permute(['1','2','3'])
答案 0 :(得分:3)
您可以就地更改列表,而不是每次都创建一个新列表。您的最终列表最后包含对同一列表的引用。
一个解决办法是写信
def permutation(self, nums, l, r):
if l == r:
self.final.append(nums.copy())
# instead of self.final.append(nums)
请注意:itertools.permutations
会为您完成这项工作。
此post可能有助于了解此处发生的情况。
并且如注释中所述:您仍然没有获得所有排列。这可能对您有用:
def permutation(self, nums, k):
r = [[]]
for i in range(k):
r = [[a] + b for a in nums for b in r if a not in b]
self.final = r