2012-04-28 15 views
7

Decir que tengo un conjunto de átomos de la siguiente manera:Crear una lista de conjuntos de átomos

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

(la longitud puede ser cualquiera)

Y quiero crear una lista de conjuntos que pueden ser hecho con ellos:

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

¿Es posible hacerlo fácilmente en python?

Quizás es muy fácil de hacer, pero no lo estoy obteniendo.
Gracias.

+0

se ha perdido el '[ 'b', 'c']', por cierto. ;) –

+0

@ Li-aungYip Verdadero, y reparado :) Gracias. – Nuno

Respuesta

15

Eso me suena como 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

Si comienzas desde '1', perderás la tupla vacía – jamylak

+1

. Toma mis votos ganadores ('itertools': ¿hay * algo * que no pueda hacer?) –

+0

¡Perfecto! ¡¡Me has alegrado el día!! :) ¡Muchas gracias! – Nuno

4

fácil. Utilice 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)] 

que produce:

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

También puede hacer:

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]