有人可以解释如何解决以下问题吗?我已经阅读了一些解释,但无法理解它......
非常感谢提前!
k = 2 # number of possible values for each element, in this case 0 or 1
length = 3 # length of list
result = [0] * length # initialise list
results = []
# generate permutations of list
def permutations(i, k, length):
j = 0
while j < k:
result[i] = j
if i == length - 1:
print("Result: ", result)
results.append(result)
print("Results: ", results)
else:
permutations(i + 1, k, length)
j += 1
permutations(0, k, length)
输出下方。问题是列表中的所有先前元素都被覆盖了......
Result: [0, 0, 0]
Results: [[0, 0, 0]]
Result: [0, 0, 1]
Results: [[0, 0, 1], [0, 0, 1]]
Result: [0, 1, 0]
Results: [[0, 1, 0], [0, 1, 0], [0, 1, 0]]
Result: [0, 1, 1]
Results: [[0, 1, 1], [0, 1, 1], [0, 1, 1], [0, 1, 1]]
Result: [1, 0, 0]
Results: [[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]]
Result: [1, 0, 1]
Results: [[1, 0, 1], [1, 0, 1], [1, 0, 1], [1, 0, 1], [1, 0, 1], [1, 0, 1]]
Result: [1, 1, 0]
Results: [[1, 1, 0], [1, 1, 0], [1, 1, 0], [1, 1, 0], [1, 1, 0], [1, 1, 0], [1, 1, 0]]
Result: [1, 1, 1]
Results: [[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]]
答案 0 :(得分:2)
您每次都会附加相同的列表。通过该引用修改列表会将更改传播到列表对象所在的每个位置;它是同一个清单。
您应该添加浅层副本,因此引用result
仅修改当前列表:
...
results.append(result[:])
否则,您可以在函数的开头创建一个新的列表对象,以便每个递归调用都有自己的列表:
def permutations(i, k, length):
result = []
...
答案 1 :(得分:0)
我相信将results.append(result)更改为result.append(result [:])应该可以解决问题。这是因为列表的可变性
答案 2 :(得分:0)
您实施的内容可以描述为重复排列或cartesian product。
可以通过这种方式生成k ** length
个列表或元组。
与任何组合,排列或产品一样,itertools可以为您提供帮助:
from itertools import product
k = 2 # number of possible values for each element, in this case 0 or 1
length = 3 # length of list
print(list(product(range(k), repeat=length)))
#[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]
完成!