2011-05-28 3 views
8

J'ai une liste que je suis en boucle avec une boucle "for" et j'exécute chaque valeur de la liste via une instruction if. Mon problème est que j'essaye de faire que le programme fasse quelque chose si toutes les valeurs dans la liste passent l'instruction if et si l'une ne passe pas, je veux qu'elle passe à la valeur suivante dans la liste. Actuellement, il renvoie une valeur si un seul élément de la liste transmet l'instruction if. Des idées pour me faire pointer dans la bonne direction? Python vous donne beaucoup d'options pour gérer une telle situation.itérer dans une liste avec une instruction if

+9

Exemple de code nous aide toujours à mieux vous aider. –

+3

Postez votre code. – GWW

+0

'sort' et comparer avec un src connu, vient à l'esprit, mais comme les autres l'ont dit, postez du code pour que nous puissions voir à quoi ressemble votre liste! –

Répondre

9

Si vous avez un exemple de code, nous pourrions le réduire pour vous.

Une option que vous pouvez regarder est l'opérateur all:

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

Vous pouvez également vérifier la longueur de la liste filtrée:

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

Si vous utilisez un for construction vous pouvez quittez la boucle tôt si vous tombez sur un test négatif:

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

La fonction test ci-dessus renvoie False sur la première valeur 2 ou inférieure, par exemple, alors qu'elle renvoie Vrai uniquement si toutes les valeurs étaient supérieures à 2.

0

Vous devez parcourir toute la liste et vérifier condition avant d'essayer de faire quoi que ce soit d'autre avec les données, donc vous avez besoin de deux boucles (ou utilisez une partie intégrée qui fait la boucle pour vous, comme tout()). De cette CodePad avec rien d'extraordinaire, 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

Peut-être que vous pourriez essayer avec une déclaration 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

Vous devez toujours être prudent si vous supprimez des éléments de votre liste alors que vous essayez de le parcourir.

Si vous ne supprimez pas fait alors cette aide:

>>> 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' 

maintenant si value_position_pairs est vide, vous avez terminé. Sinon, vous pouvez augmenter i par un pour passer à la valeur suivante ou parcourir les valeurs échouées en utilisant leur position dans le tableau.

Questions connexes