Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的Powerset算法+;并附加到列表中_Python_Python 3.x_Algorithm_Powerset - Fatal编程技术网

Python中的Powerset算法+;并附加到列表中

Python中的Powerset算法+;并附加到列表中,python,python-3.x,algorithm,powerset,Python,Python 3.x,Algorithm,Powerset,我正在用Python解决powerset问题 集S的幂集p(S)是S的所有子集的集。例如,如果S={a,b,c}那么p(S)={{},{a},{b},{c},{a,b},{a,b},{a,c},{b,c} 此解决方案工作正常: def动力装置(阵列): 功率集=[]] 对于数组中的num: 对于范围内的i(len(powerset)): 电流子集=功率集[i] powerset.append(当前子集+[num]) 返回动力装置 但是,此解决方案不: def动力装置(阵列): 功率集=[]]

我正在用Python解决powerset问题

集S的幂集p(S)是S的所有子集的集。例如,如果
S={a,b,c}
那么
p(S)={{},{a},{b},{c},{a,b},{a,b},{a,c},{b,c}

此解决方案工作正常:

def动力装置(阵列):
功率集=[]]
对于数组中的num:
对于范围内的i(len(powerset)):
电流子集=功率集[i]
powerset.append(当前子集+[num])
返回动力装置
但是,此解决方案不:

def动力装置(阵列):
功率集=[]]
对于数组中的num:
对于范围内的i(len(powerset)):
电流子集=功率集[i]
curr\u subset.append(num)
powerset.append(当前子集)
返回动力装置
它似乎会在每个powerset.append操作上覆盖powerset中的每个数组。对于
[1,2,3]
的输入,我的返回值为:

[[1,2,2,3,3,3,3],
[1, 2, 2, 3, 3, 3, 3],
[1, 2, 2, 3, 3, 3, 3],
[1, 2, 2, 3, 3, 3, 3],
[1, 2, 2, 3, 3, 3, 3],
[1, 2, 2, 3, 3, 3, 3],
[1, 2, 2, 3, 3, 3, 3],
[1, 2, 2, 3, 3, 3, 3]]

你知道我在这里没有完全理解什么吗?

你的算法的问题是列表是可变的,你正在创建一个包含对同一列表的引用的列表。任何时候附加到其中一个,都是附加到所有,因为只有一个。它们都是同一个列表,您只是有多个引用

想象一下,有一张10份某人电话号码的清单;如果你拨打第一个电话号码并让他们戴上帽子,那么当你拨打第二个电话号码时,另一端的人已经戴上帽子了,因为这是同一个人。如果你每次给每个号码打电话并说“戴上帽子”,你会得到一个10个电话号码的列表,其中一个戴着10顶帽子,而实际上你想要的是10个戴着一顶帽子的人的电话号码

设计这种算法最简单的方法是完全避免变异;使用元组而不是列表。这样,每次向元组添加另一个元素时,您都在创建一个新元组,而不是更改现有元组

请注意,这与使用
curr\u subset+[num]
的第一个解决方案非常相似;
+
操作会创建一个新列表,而
append
会更改现有列表的状态

def动力装置(阵列):
#包含空元组的列表
功率集=[()]
对于数组中的num:
对于范围内的i(len(powerset)):
电流子集=功率集[i]
#在元组中再添加一个数字
curr_子集+=(num,)
powerset.append(当前子集)
返回动力装置
例如:

>>功率集([1,2,3])
[(), (1,), (2,), (1, 2), (3,), (1, 3), (2, 3), (1, 2, 3)]

尝试将其插入调试器(例如),以便您可以单步执行并查看到底发生了什么。顺便说一句,欢迎使用堆栈溢出!请查看。感谢您快速而彻底的回复!这件事澄清了很多。非常感谢。