Python程序返回列表的子列表

时间:2018-02-14 16:59:21

标签: python

请设计一个返回列表所有可能子集的函数。这是我试过的代码

def mylist(list1):
    for I in list1:
        print(i)

2 个答案:

答案 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]]

您也可能希望将此函数转换为生成器,因为如果输入列表包含大量值,则返回的列表将很大