2017-10-04 9 views
0

'보충'이 올바른 단어인지 확실하지 않지만 예제를 통해 문제를 설명합니다. 의 우리의 목록입니다 가정 해 봅시다 : 내가 찾으려고 노력하고 무엇파이썬 목록의 모든 보조 하위 집합

[1,2,3,4] 

은 다음과 같습니다

[1], [2], [3], [4] 
[1,2], [3], [4] 
[1,3], [2], [4] 
... 
[1,2], [3,4] 
[1,3], [2,4] 
... 
[1,2,3], [4] 
[1,2,4], [3] 
... 
[1,2,3,4] 

즉, 나는 그들이 함께 초기 목록의 모든 요소를 ​​가지고 모든 목록은 얻을하려고합니다.

감사합니다.

+0

로 변경합니다. 더 많은 관심을 지불하십시오 .. @unutbu – lincinthesink

+0

당신은 지금까지 어떤 시도를 했습니까? 행운? –

+0

'파워 세트'에 대한 코드 샘플을 찾으십시오. powerset은 모든 하위 집합의 집합입니다. https://en.wikipedia.org/wiki/Power_set –

답변

2

Raymond Hettinger's partition recipe을 사용하여 모든 파티션을 찾을 수 있습니다. 파이썬 3을 사용하기 위해 약간 수정했습니다. 또한 partition_permutations을 추가하여 입력의 모든 순열 분할을 찾으십시오. x. 순서화 같은

[[[1], [2], [3], [4]], 
[[1], [2], [3, 4]], 
[[1], [2], [4, 3]], 
[[1], [2, 3], [4]], 
[[1], [2, 3, 4]], 
[[1], [2, 4], [3]], 
[[1], [2, 4, 3]], 
[[1], [3], [4, 2]], 
[[1], [3, 2], [4]], 
[[1], [3, 2, 4]], 
[[1], [3, 4, 2]], 
[[1], [4, 2, 3]], 
[[1], [4, 3, 2]], 
[[1, 2], [3], [4]], 
[[1, 2], [3, 4]], 
[[1, 2], [4, 3]], 
[[1, 2, 3], [4]], 
[[1, 2, 3, 4]], 
[[1, 2, 4], [3]], 
[[1, 2, 4, 3]], 
[[1, 3], [2], [4]], 
[[1, 3], [2, 4]], 
[[1, 3], [4, 2]], 
[[1, 3, 2], [4]], 
[[1, 3, 2, 4]], 
[[1, 3, 4], [2]], 
[[1, 3, 4, 2]], 
[[1, 4], [2], [3]], 
[[1, 4], [2, 3]], 
[[1, 4], [3, 2]], 
[[1, 4, 2], [3]], 
[[1, 4, 2, 3]], 
[[1, 4, 3], [2]], 
[[1, 4, 3, 2]], 
[[2], [3], [4, 1]], 
[[2], [3, 1], [4]], 
[[2], [3, 1, 4]], 
[[2], [3, 4, 1]], 
[[2], [4, 1, 3]], 
[[2], [4, 3, 1]], 
[[2, 1], [3], [4]], 
[[2, 1], [3, 4]], 
[[2, 1], [4, 3]], 
[[2, 1, 3], [4]], 
[[2, 1, 3, 4]], 
[[2, 1, 4], [3]], 
[[2, 1, 4, 3]], 
[[2, 3], [4, 1]], 
[[2, 3, 1], [4]], 
[[2, 3, 1, 4]], 
[[2, 3, 4, 1]], 
[[2, 4], [3, 1]], 
[[2, 4, 1], [3]], 
[[2, 4, 1, 3]], 
[[2, 4, 3, 1]], 
[[3], [4, 1, 2]], 
[[3], [4, 2, 1]], 
[[3, 1], [4, 2]], 
[[3, 1, 2], [4]], 
[[3, 1, 2, 4]], 
[[3, 1, 4, 2]], 
[[3, 2], [4, 1]], 
[[3, 2, 1], [4]], 
[[3, 2, 1, 4]], 
[[3, 2, 4, 1]], 
[[3, 4, 1, 2]], 
[[3, 4, 2, 1]], 
[[4, 1, 2, 3]], 
[[4, 1, 3, 2]], 
[[4, 2, 1, 3]], 
[[4, 2, 3, 1]], 
[[4, 3, 1, 2]], 
[[4, 3, 2, 1]]] 

참고 partition_permutations 그 취급 각 파티션 내부의 항목 :

import pprint 
import itertools as IT 

def partition(iterable, chain=IT.chain, map=map): 
    """ 
    http://code.activestate.com/recipes/576795/ (Raymond Hettinger) 
    >>> list(partition('abcd')) 
    [['abcd'], 
    ['a', 'bcd'], 
    ['ab', 'cd'], 
    ['abc', 'd'], 
    ['a', 'b', 'cd'], 
    ['a', 'bc', 'd'], 
    ['ab', 'c', 'd'], 
    ['a', 'b', 'c', 'd']] 
    """ 
    s = iterable if hasattr(iterable, '__getitem__') else tuple(iterable) 
    n = len(s) 
    first, middle, last = [0], range(1, n), [n] 
    getitem = s.__getitem__ 
    return [list(map(getitem, map(slice, chain(first, div), chain(div, last)))) 
      for i in range(n) for div in IT.combinations(middle, i)] 

def partition_permutations(iterable, ordered_partitions=False): 
    result = set() 
    for perm in IT.permutations(iterable): 
     for item in partition(perm): 
      if ordered_partitions: 
       result.add(tuple(item)) 
      else: 
       result.add(tuple(sorted(item))) 
    result = [list(map(list, item)) for item in result] 
    result = sorted(result) 
    return result 


x = [1,2,3,4] 
result = partition_permutations(x, ordered_partitions=True) 
pprint.pprint(result) 
print(len(result)) 

73 개 항목을 산출한다. 즉, 예를 들어 [[1,4], [2,3]][[2,3], [1,4]]은 동일한 파티션으로 처리 된 입니다. 즉 당신이 원하는없는 경우,이 분명히 그 질문과 중복되지

result = partition_permutations(x) 

result = partition_permutations(x, ordered_partitions=True) 
+0

고마워요. 그것은 내가 찾고있는 것에 매우 가깝지만, 몇 가지 목록을 반환하지는 않습니다. 예 : [[1,4], [2,3]] 또는 [[1,4], [2], [3]]. – lincinthesink