2016-01-18 10 views
12

Sto tentando di stampare tutte le possibili enumerazioni di un elenco per tre variabili. Per esempio se il mio ingresso è:Enumerazione di tre variabili nella comprensione elenco python

x = 1 
y = 1 
z = 1 

Voglio l'uscita di essere come:

[[0, 0, 0], [0, 0, 1], [0, 1, 0], [1, 0, 0], [1, 1, 0], [1, 0, 1], [0, 1, 1], [1, 1, 1]] 

Se una delle x, y, variabili Z sono superiori a 1, sarebbe enumerare tutti i numeri interi da 0 al valore della variabile. Ad esempio, se x = 3 allora 0, 1, 2 o 3 sarebbero possibili nel primo slot degli elenchi di 3 elementi.

In questo momento mi sto creando la lista di comprensione in questo modo:

output = [ [x,y,z] for x,y,z in range(x,y,z)] 

penso che qualcosa non va con la funzione di gamma?

+0

Vuoi l'output in esattamente quell'ordine? E se sì, come sarebbe l'ordine per un input più complesso? –

+0

Non mi interessa l'ordine, ma vorrei che fosse estensibile a valori di variabili non binari, quindi, come se x = 2, ci sarebbero liste come [2,0,0] [2,0,1 ], [2,1,0], [2,1,1] nell'output. –

risposta

8

complementare alle soluzioni che utilizzano product, si potrebbe anche utilizzare una lista di comprensione tripla.

>>> x, y, z = 1, 2, 3 
>>> [(a, b, c) for a in range(x+1) for b in range(y+1) for c in range(z+1)] 
[(0, 0, 0), 
(0, 0, 1), 
(0, 0, 2), 
(some more), 
(1, 2, 2), 
(1, 2, 3)] 

Il +1 è necessaria in quanto range non include il limite superiore. Se si desidera che l'output sia un elenco di elenchi, è sufficiente eseguire [[a, b, c] for ...].

Si noti, tuttavia, che questo sarà ovviamente solo lavoro è avere sempre tre variabili (x, y, z), mentre product sarebbe lavorare con un numero arbitrario di liste/limiti superiori.

14

è possibile utilizzare la funzione di product() da itertools come segue:

from itertools import product 

answer = list(list(x) for x in product([0, 1], repeat=3)) 
print(answer) 

uscita

[[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]] 
+0

In realtà, le variabili potrebbero anche non essere binarie, quindi se x = 2, y = 1, z = 1, potrebbero esserci anche liste come [2,1,1] nell'output ... c'è un modo per fare la tua soluzione usando le variabili x, ye z invece di hard coding 1 e 0 lì? –

+0

Felice di aiutare, ma probabilmente meglio se lo si pone in una domanda a parte, poiché probabilmente richiede un approccio leggermente diverso! – gtlambert

+0

Perché convertire in seguito?Basta fare lo stesso prima di convertire il generatore 'prodotto' in un elenco, ad es. '[lista (x) per x nel prodotto (...)]' o 'lista (mappa (lista, prodotto (...))' –

6

È possibile utilizzare range() funzione all'interno di una lista di comprensione e itertools.product funzione:

>>> x = 1 
>>> y = 1 
>>> z = 1 
>>> from itertools import product 
>>> list(product(*[range(i+1) for i in [x,y,z]])) 
[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)] 

Questo approccio funziona per diversi numeri anche:

>>> x = 2 
>>> y = 2 
>>> z = 2 
>>> 
>>> list(product(*[range(i+1) for i in [x,y,z]])) 
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 1, 0), (0, 1, 1), (0, 1, 2), (0, 2, 0), (0, 2, 1), (0, 2, 2), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 2, 0), (1, 2, 1), (1, 2, 2), (2, 0, 0), (2, 0, 1), (2, 0, 2), (2, 1, 0), (2, 1, 1), (2, 1, 2), (2, 2, 0), (2, 2, 1), (2, 2, 2)] 
>>> 
+0

C'è un modo per ottenere l'output sotto forma di liste piuttosto che di tuple? –

+0

@WilliamRoss Sì puoi usare una comprensione delle liste invece della funzione 'lista'.' [lista (elemento) per articolo nel prodotto (* [intervallo (i + 1) per i in [x , y, z]])] – Kasramvd

3

Se avete bisogno in forma di una lista di liste (invece di lista di tuple) è possibile utilizzare map sopra l'uscita della risposta da Kasramvd, vale a dire:

map(list,list(product(*[range(i+1) for i in [x,y,z]]))) 
+4

1) in Python 3, 'map' produce un generatore, non una lista e 2) non c'è bisogno di trasformare il generatore restituito da' product' in una lista prima di passarlo a 'map '. Quindi questo dovrebbe piuttosto essere 'lista (mappa (lista, prodotto (...))' –

Problemi correlati