2011-05-28 11 views
8

Tengo una lista que estoy recorriendo con un bucle "for" y estoy ejecutando cada valor en la lista a través de una instrucción if. Mi problema es que estoy tratando de hacer que el programa haga algo si todos los valores en la lista pasan la sentencia if y, si no se aprueba, quiero que avance al siguiente valor de la lista. Actualmente está devolviendo un valor si un solo elemento en la lista pasa la instrucción if. ¿Alguna idea para que apunte en la dirección correcta?iterando a través de una lista con una instrucción if

+9

El código de ejemplo siempre nos ayuda a ayudarlo mejor. –

+3

Publica tu código. – GWW

+0

'ordenar' y compararlo con un código conocido, me viene a la mente, pero como han dicho los otros, publique un código para que podamos ver cómo se ve su lista. –

Respuesta

9

Python le ofrece una gran cantidad de opciones para hacer frente a una situación así. Si tiene un código de ejemplo, podemos reducirlo para usted.

Una opción que podría tener en cuenta es el operador all:

>>> all([1,2,3,4]) 
True 
>>> all([1,2,3,False]) 
False 

También puede comprobar la longitud de la lista filtrada:

>>> input = [1,2,3,4] 
>>> tested = [i for i in input if i > 2] 
>>> len(tested) == len(input) 
False 

Si está utilizando un constructo for que pueda salga del ciclo antes si encuentra una prueba negativa:

>>> def test(input): 
...  for i in input: 
...   if not i > 2: 
...    return False 
...   do_something_with_i(i) 
...  return True 

La función test anterior arrojará False en el primer valor que sea 2 o menos, por ejemplo, mientras que devolverá True solo si todos los valores fueran mayores que 2.

0

Tiene que recorrer toda su lista y verificar el condición antes de tratar de hacer cualquier otra cosa con los datos, por lo que necesita dos bucles (o utilizar algunos integrados que hace el bucle para usted, como todos()). A partir de este teclado sin nada de lujos, http://codepad.org/pKfT4Gdc

def my_condition(v): 
    return v % 2 == 0 

def do_if_pass(l): 
    list_okay = True 
    for v in l: 
    if not my_condition(v): 
     list_okay = False 

    if list_okay: 
    print 'everything in list is okay, including', 
    for v in l: 
     print v, 
    print 
    else: 
    print 'not okay' 

do_if_pass([1,2,3]) 
do_if_pass([2,4,6]) 
3

Tal vez usted podría tratar con una declaración for ... else.

for item in my_list: 
    if not my_condition(item): 
     break # one item didn't complete the condition, get out of this loop 
else: 
    # here we are if all items respect the condition 
    do_the_stuff(my_list) 
0

Siempre hay que tener cuidado si va a eliminar artículos de su lista, mientras que usted está tratando de iterar a través de él.

Si no va a eliminar a continuación, ayuda esto:

>>> yourlist=list("abcdefg") 
>>> value_position_pairs=zip(yourlist,range(len(yourlist))) 
>>> value_position_pairs 
[('a', 0), ('b', 1), ('c', 2), ('d', 3), ('e', 4), ('f', 5), ('g', 6)] 
>>> filterfunc=lambda x:x[0] in "adg" 
>>> value_position_pairs=filter(filterfunc,value_position_pairs) 
>>> value_position_pairs 
[('a', 0), ('d', 3), ('g', 6)] 
>>> yourlist[6] 
'g' 

ahora si value_position_pairs está vacía ya está. Si no, puede aumentar i en uno para ir al siguiente valor o repetir los valores fallidos utilizando su posición en el conjunto.

Cuestiones relacionadas