Python 3所有可能的内聚组合列表

时间:2018-10-18 14:53:53

标签: python python-3.x

嗨,我正在尝试列出另一个列表的所有可能的内聚组合,因此我想从[0,1,2,3]中获得[[0],[0、1],[ 0、1、2],[0、1、2、3],[1],[1、2],[1、2、3],[2],[2、3],[3]]。到目前为止,我已经知道了:

def expandArray(arr):
    result = []
    for x in range(0, len(arr)):
        subArray = [arr[x]]
        result.append(subArray)
        for y in range(x + 1, len(arr)):
            subArray.append(arr[y])
            result.append(subArray)
    return(result)

但这返回:[[0,1,2,3],[0,1,2,3],[0,1,2,3],[0,1,2,3],[1 ,2、3],[1、2、3],[1、2、3],[2、3],[2、3],[3]]。

我在做什么错了?

2 个答案:

答案 0 :(得分:0)

subArray是您在for循环中修改的列表。追加到列表时,您不会创建新列表,而是对其进行了修改,然后将其再次放入列表中,因此最终将获得包含同一列表的多个副本的结果。比较这段代码:

a = []
b = [5]
a.append(b)
b.append(1)
a.append(b)

print(a)

将输出:

[[5, 1], [5, 1]]

答案 1 :(得分:0)

以下是使用list slicing获得所需输出的一种方法:

def get_combs(iterable):
    for k, _ in enumerate(iterable):
        elm = k
        while elm <= len(iterable):
            data = iterable[k:elm]
            elm += 1
            if data:
                yield data

combs = list(get_combs([0, 1, 2, 3]))
print(combs)

输出:

[[0], [0, 1], [0, 1, 2], [0, 1, 2, 3], [1], [1, 2], [1, 2, 3], [2], [2, 3], [3]]