2012-04-28 11 views
7

Say Mam tablicę atomów takiego:Utwórz listę zestawów atomów

['a', 'b', 'c'] 

(długość może być dowolny)

I chcę utworzyć listę zestawów, które mogą być wykonane z nich:

[ 
    ['a'], ['b'], ['c'], 
    ['a', 'b'], ['a', 'c'], ['b', 'c'], 
    ['a', 'b', 'c'] 
] 

Czy można to łatwo zrobić w pythonie?

Może to bardzo łatwe do zrobienia, ale sam nie rozumiem.
Dziękuję.

+0

Przegapiłeś '[ 'b', 'c']', nawiasem mówiąc. ;) –

+0

@ Li-aungYip Prawda, i naprawione :) Dziękuję. – Nuno

Odpowiedz

15

To brzmi dla mnie jak powerset:

def powerset(iterable): 
    "powerset([1,2,3]) -->() (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)" 
    s = list(iterable) 
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1)) 
+0

Jeśli zaczniesz od '1', tracąc pustą krotkę – jamylak

+1

Przybiłeś ją. Weź moje przegrane. ('itertools': czy jest * coś * czego nie można zrobić?) –

+0

Idealnie! Zrobiłeś mój dzień !! :) Dziękuję Ci bardzo! – Nuno

4

Easy. Użyj itertools.combinations():

from itertools import combinations 

atom = list('abc') 

combs = [i for j in range(1, len(atom) + 1) for i in combinations(atom, j)] 

co daje:

[('a',), ('b',), ('c',), ('a', 'b'), ('a', 'c'), ('b', 'c'), ('a', 'b', 'c')] 
0

Można również zrobić:

from itertools import product 
masks = [p for p in product([0, 1], repeat=len(data))] 
combs = [[x for i, x in enumerate(data) if mask[i]] for mask in masks] 
Powiązane problemy