перебирая список с помощью оператора if - PullRequest
9 голосов
/ 29 мая 2011

У меня есть список, который я перебираю с помощью цикла for и выполняю каждое значение в списке с помощью оператора if.Моя проблема в том, что я пытаюсь заставить программу что-то делать только в том случае, если все значения в списке передают оператор if, а если нет, я хочу, чтобы она переместилась к следующему значению в списке.В настоящее время он возвращает значение, если один элемент в списке проходит оператор if.Любые идеи, чтобы направить меня в правильном направлении?

Ответы [ 4 ]

10 голосов
/ 29 мая 2011

Python предоставляет множество вариантов действий в такой ситуации.Если у вас есть пример кода, мы можем сузить его для вас.

Один вариант, на который вы можете посмотреть, это оператор all:

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

Вы также можетепроверьте длину отфильтрованного списка:

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

Если вы используете конструкцию for, вы можете выйти из цикла раньше, если натолкнетесь на отрицательный тест:

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

Например, функция test, приведенная выше, вернет значение False для первого значения, равного 2 или ниже, в то время как она вернет значение True, только если все значения были больше 2.

3 голосов
/ 29 мая 2011

Может быть, вы могли бы попробовать с 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 голосов
/ 29 мая 2011

Вы всегда должны быть осторожны, если вы удаляете элементы из своего списка, когда вы пытаетесь перебрать его.

Если вы не удаляете, то поможет ли это:

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

Теперь, если value_position_pairs пусто, все готово.Если нет, вы можете увеличить i на единицу, чтобы перейти к следующему значению или выполнить итерацию по ошибочным значениям, используя их позицию в массиве.

0 голосов
/ 29 мая 2011

Вам нужно пройтись по всему списку и проверить условие, прежде чем пытаться делать что-либо еще с данными, поэтому вам нужно два цикла (или использовать некоторые встроенные, которые делают цикл за вас, как и все ()). С этой кодовой панели ничего особенного, 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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...