2012-08-31 13 views
10

Supponiamo che io sono un elenco:iterare su (voce, altri) in un elenco

l = [0, 1, 2, 3] 

Come posso iterare l'elenco, prendendo ogni elemento con il suo complemento dalla lista? Cioè,

for item, others in ... 
    print(item, others) 

sarebbe stampare

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

Idealmente Sto cercando un'espressione conciso che posso utilizzare in una comprensione.

risposta

13

Questo è abbastanza semplice e comprensibile:

for index, item in enumerate(l): 
    others = l[:index] + l[index+1:] 

È potrebbe fare un iteratore fuori di questo se insisti:

def iter_with_others(l): 
    for index, item in enumerate(l): 
     yield item, l[:index] + l[index+1:] 

Dare è l'utilizzo:

for item, others in iter_with_others(l): 
    print(item, others) 
+0

Questo funziona bene ed è esattamente ciò che ecatmur chiesto, ma sembra un esercizio di creazione di liste gratuite. Potrebbe funzionare abbastanza male con elenchi più grandi. Mi chiedo se potrebbe essere meglio creare una sorta di oggetto wrapper che fornisce una vista nell'elenco originale. –

+0

@StevenRumbalski: sì, ma lascerò questo come esercizio per il lettore a meno che non ci sia una grande richiesta. – orlp

3

Rispondendo alla mia domanda, è possibile utilizzare itertools.combinations sfruttando il fatto che il risultato viene emesso in ordine lessicografico:

from itertools import combinations 
zip(l, combinations(reversed(l), len(l) - 1)) 

Tuttavia, questo è abbastanza oscuro; La soluzione di Nightcracker è un lotto più facile da capire per il lettore!

2

Che dire

>>> [(i, [j for j in L if j != i]) for i in L] 
[(0, [1, 2, 3]), (1, [0, 2, 3]), (2, [0, 1, 3]), (3, [0, 1, 2])] 

OK, questo è un trilione di test e la soluzione @ di nightcracker è probabilmente più efficiente, ma eh ...

+0

È possibile utilizzare le espressioni del generatore anziché le descrizioni delle liste e quindi evitare di creare elenchi non necessari come @StevenRumbalski aveva sognato. –

+0

Sì, potrei usare un generatore per l'intera espressione, ma non per il ciclo interno: l'OP voleva stampare liste, non generatori .. –

+0

Giusto, almeno nel suo esempio. La domanda è se questo è davvero ciò che vuole fare con i risultati. Ma può decidere da solo. –

Problemi correlati