我写了一个递归函数,它创建nx3数据(其中n是变量)的所有可能结果的组合
数据点的结构 [name_of_variable cluster_number uniqueness_condition]
from collections import defaultdict
x= [[1,1,'a'],[2,1,'b'],[3,1,'c'],[4,2,'c'],[5,2,'d'],[6,2,'a'],[7,3,'a'],[8,3,'d']]
c=defaultdict(list)
for i in x:
c[i[1]]+=[i]
w=list()
def rec_cal(i,lis):
if i in c.keys():
for j in c[i]:
lis.append(j[0])
rec_cal(i+1,lis)
lis.pop()
else:
global w
w.append(lis)##print(lis)
rec_cal(1,[])
我试图将所有生成的3对存储在w中,但是最后我得到一个空列表,我在哪里出错了,将不胜感激任何帮助
p.s。如果写print(lis)而不是w.append(lis),则所有正确的列表都会被打印。
答案 0 :(得分:3)
调用w.append(lis)
时,会将引用附加到列表lis
,而不是列表的副本。递归函数返回时,您追加到lis
的所有内容也会弹出,因此您在w
中得到的所有内容都是对同一空列表的大量引用。
此外,不要执行i in c.keys()
,而只是执行i in c
,并且您没有为w
分配新值,因此不需要使用global w
。
答案 1 :(得分:0)
运行
w[0] is w[1]
可以帮助您了解失败的原因。您添加的所有引用均指向同一对象。
替换
w.append(lis)
使用
w.append(lis.copy())
是一种快速修复。但通常要谨慎使用变数列表和引用列表。