2012-08-31 19 views
10

Supongamos que tengo una lista:iterar sobre (tema, otros) en una lista

l = [0, 1, 2, 3] 

¿Cómo puedo iterar sobre la lista, teniendo cada elemento junto con su complemento de la lista? Es decir,

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

imprimiría

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

Idealmente Busco una expresión concisa que pueda utilizar en una comprensión.

Respuesta

13

Esto es bastante fácil y comprensible:

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

Usted podría hacer un iterador de esto si usted insiste:

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

Dar es uso:

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

Esto funciona bien y es exactamente lo ecatmur pidió, pero parece un ejercicio de creación de listas gratuitas. Podría funcionar bastante mal con listas más grandes. Me pregunto si sería mejor crear algún tipo de objeto contenedor que proporcione una vista en la lista original. –

+0

@StevenRumbalski: sí, pero dejaré esto como un ejercicio para el lector a menos que exista una gran demanda. – orlp

3

Respondiendo a mi propia pregunta, es posible usar itertools.combinations explotando el hecho de que el resultado se emite en orden lexicográfico:

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

Sin embargo, esto es bastante oscuro; la solución de Nightcracker es un lote ¡más fácil de entender para el lector!

2

¿Qué hay de

>>> [(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, eso es un tropecientos de pruebas y solución de @ nightcracker es probable más eficiente, pero eh ...

+0

Puede usar expresiones de generador en lugar de las listas de comprensión y evitar así crear listas innecesarias como @StevenRumbalski había soñado. –

+0

Sí, podría usar un generador para toda la expresión, pero no para el ciclo interno: el OP quería imprimir listas, no generadores ... –

+0

Correcto, al menos en su ejemplo. La pregunta es si eso es realmente lo que quiere hacer con los resultados. Pero él puede decidir eso por sí mismo. –

Cuestiones relacionadas