在Python中创建PowerSet的函数是如何工作的?

在Python中创建PowerSet的函数是如何工作的?,python,Python,我在寻找一种不用模块就可以在Python中创建幂集(一个集的所有可能的子集)的方法 我在网上找到了很多方法。仅在这个论坛上就有很多答案。但是,尽管所有的代码都能正常工作,但我无法找到一个答案,即我能够理解代码在做什么。我是Python新手,我的主要目标是学习,而不是找到一个可以正常工作的代码 有人能给我解释一下下面的代码是如何生成子集列表的吗 def powerset(s): x = len(s) for i in range(1 << x): pri

我在寻找一种不用模块就可以在Python中创建幂集(一个集的所有可能的子集)的方法

我在网上找到了很多方法。仅在这个论坛上就有很多答案。但是,尽管所有的代码都能正常工作,但我无法找到一个答案,即我能够理解代码在做什么。我是Python新手,我的主要目标是学习,而不是找到一个可以正常工作的代码

有人能给我解释一下下面的代码是如何生成子集列表的吗

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]