请设计一个返回列表所有可能子集的函数。这是我试过的代码
def mylist(list1):
for I in list1:
print(i)
答案 0 :(得分:0)
如果您正在寻找的是powerset,itertools' recipe page有一个简洁,简洁,内存安全的方法:
from itertools import chain, combinations
def powerset(iterable):
"""
powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)
"""
s = list(iterable)
# note that this returns an iterator rather than a list
return chain.from_iterable(combinations(s,n) for n in range(len(s)+1))
值得指出的是,找到一个powerset是指数O(2 ^ n)。此外,此问题之前已经回答here。
答案 1 :(得分:0)
只需使用迭代方法即可
我从0
循环到2^(length of list)
并根据循环计数器的值选择每个元素
即如果循环计数器为5,我们选择第一个和第三个元素
因为二进制中的5表示为101
我们选择二进制1的索引元素同样为7我们需要前三个元素111
def mylist(list1):
num=len(list1)
result=[]
for i in range(1<<num):
temp=list()
index=0
while i:
if i&1==1:
temp.append(list1[index])
index+=1;
i>>=1
result.append(temp)
return result
print(mylist([1,2,3]))
<强>输出
[[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]
您也可能希望将此函数转换为生成器,因为如果输入列表包含大量值,则返回的列表将很大