在Python中创建PowerSet的函数是如何工作的?
我在寻找一种不用模块就可以在Python中创建幂集(一个集的所有可能的子集)的方法 我在网上找到了很多方法。仅在这个论坛上就有很多答案。但是,尽管所有的代码都能正常工作,但我无法找到一个答案,即我能够理解代码在做什么。我是Python新手,我的主要目标是学习,而不是找到一个可以正常工作的代码 有人能给我解释一下下面的代码是如何生成子集列表的吗在Python中创建PowerSet的函数是如何工作的?,python,Python,我在寻找一种不用模块就可以在Python中创建幂集(一个集的所有可能的子集)的方法 我在网上找到了很多方法。仅在这个论坛上就有很多答案。但是,尽管所有的代码都能正常工作,但我无法找到一个答案,即我能够理解代码在做什么。我是Python新手,我的主要目标是学习,而不是找到一个可以正常工作的代码 有人能给我解释一下下面的代码是如何生成子集列表的吗 def powerset(s): x = len(s) for i in range(1 << x): pri
def powerset(s):
x = len(s)
for i in range(1 << x):
print [s[j] for j in range(x) if (i & (1 << j))]
powerset([4,5,6])
我真的不明白,也找不到的是:
range(1 << x)
if (i & (1 << j))
range(1作为旁注,X的幂集在数学文献中通常表示为2^X。如果集合X中有N个元素,则幂集的大小为2^N
生成幂集的一种方法是通过位图:假设有N个元素作为大小为N的数组排列,然后枚举0到2^N-1之间的所有整数并以二进制形式写入,那么幂集的每个元素都是根据每个二进制数从数组中选取的子集
例如,如果您有[4,5,6]
,并且您枚举0到7=2^3-1,则您有这些数字和相应的子集:
0 = 000 -> []
1 = 001 -> [6]
2 = 010 -> [5]
3 = 011 -> [5, 6]
...
6 = 110 -> [4, 5]
7 = 111 -> [4, 5, 6]
要将其转换为代码,请注意以下几点:
- 2^N等于
1这些是Python逐位操作。1代码使用二进制计数方法生成幂集。与
0 = 000 -> []
1 = 001 -> [6]
2 = 010 -> [5]
3 = 011 -> [5, 6]
...
6 = 110 -> [4, 5]
7 = 111 -> [4, 5, 6]