блок else никогда не выполняется - PullRequest
2 голосов
/ 22 ноября 2011

Я пытаюсь сравнить пользовательский ввод с каждым элементом списка, где NL - список, но по какой-то причине он никогда не входит в цикл else.

NL = range(1, sc.NLayer + 1)

if (x for x in NL if x < sc.NLayer): 
    print 'true'
else:
    print 'false'

sc.NLayer - это пользовательский ввод.

предположим sc.NLayer = 5; это не нарушает остальное условие. Пожалуйста, помогите

Ответы [ 3 ]

3 голосов
/ 22 ноября 2011

Возможно, вы захотите использовать встроенную функцию any.

any([True, False, 0, []])
=> True

Итак, в вашем коде это будет:

if any(x for x in NL if x < sc.NLayer):
    print 'true'
else:
    print 'false'

или, возможно, цикл for:

for x in NL:
    if x < sc.NLayer:
        print 'true'
    else:
        print 'false'
2 голосов
/ 22 ноября 2011

Да, нет.

if any(x for x in NL if x <sc.NLayer): 
  print 'true'
else:
  print 'false'
1 голос
/ 22 ноября 2011

В случае, если из других ответов не ясно, ваша проблема заключается в следующем:

if (x for x in NL if x < sc.NLayer):

В этом синтаксисе вы создали так называемое выражение генератора , котороекак понимание списка, но вместо этого он возвращает генератор.Сам генератор представляет собой сложный объект, и поэтому, если он будет возвращен , он всегда будет иметь значение True.Генераторы имеют свой собственный протокол, в котором вы должны явно извлекать элементы по одному.При итерации это не сразу очевидно, потому что итерация автоматически делает это за вас, но при оценке она отличается.

И наоборот, если вы действительно выполняете это как понимание списка, вы должны получить желаемый результат, потому чтопустой список ([]) оценивается как False!Я думаю, что это ближе к тому, что вы хотите.

Вот простой пример, который можно проиллюстрировать, оценивая содержимое mylist с пониманием списка, которое возвратит пустой список:

>>> mylist = range(10)
>>> [x for x in mylist if x == 'a']  
[]

Там твой пустой список.Теперь оцените это с помощью bool() и обратите внимание, что это False:

>>> bool([x for x in mylist if x == 'a'])
False

Хорошо, так что если вы оцените его вместо выражения генератора:

>>> (x for x in mylist if x == 'a')
<generator object <genexpr> at 0xb7ebc644>
>>> bool((x for x in mylist if x == 'a'))
True

И дляНапример, если вы приведете это выражение генератора к списку, вы увидите, что оно на самом деле не дает результатов:

>>> list((x for x in mylist if x == 'a'))
[]

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...