在 python 中查找集合的子集(顺序无关紧要)
Find subsets of a set in python (order does not matter)
我需要找到集合的子集 L = [0, 3, 4, 6, 9, 11, 12, 13]
。
我在网上看到了以下解决方案:
def powerset(s):
x = len(s)
masks = [1 << i for i in range(x)]
for i in range(1 << x):
yield [ss for mask, ss in zip(masks, s) if i & mask]
print(list(powerset(L)))
但是,此代码还会 return 我的完整集 L 和我不想要的空集。
我一直在寻找一种直接在 python 中执行此操作而不使用任何其他软件包的方法。
这是一个非常简单的解决方案。我把它作为集合列表来做,但如果你愿意,你可以轻松地切换到元组列表。
def subsets(r):
res = []
for i in range(1, 2**len(r)-1):
key = format(i, '#010b')
res.append({x for j, x in enumerate(r) if key[~j] == '1'})
return res
L = [0, 3, 4, 6, 9, 11, 12, 13]
print(subsets(L))
编辑:我刚刚意识到我几乎只是复制了您已有的解决方案,而且可能是以一种效率较低的方式。哦,好吧,我会留下这个,因为它确实回答了问题。
我需要找到集合的子集 L = [0, 3, 4, 6, 9, 11, 12, 13]
。
我在网上看到了以下解决方案:
def powerset(s):
x = len(s)
masks = [1 << i for i in range(x)]
for i in range(1 << x):
yield [ss for mask, ss in zip(masks, s) if i & mask]
print(list(powerset(L)))
但是,此代码还会 return 我的完整集 L 和我不想要的空集。
我一直在寻找一种直接在 python 中执行此操作而不使用任何其他软件包的方法。
这是一个非常简单的解决方案。我把它作为集合列表来做,但如果你愿意,你可以轻松地切换到元组列表。
def subsets(r):
res = []
for i in range(1, 2**len(r)-1):
key = format(i, '#010b')
res.append({x for j, x in enumerate(r) if key[~j] == '1'})
return res
L = [0, 3, 4, 6, 9, 11, 12, 13]
print(subsets(L))
编辑:我刚刚意识到我几乎只是复制了您已有的解决方案,而且可能是以一种效率较低的方式。哦,好吧,我会留下这个,因为它确实回答了问题。