2015-01-30 4 views
0

Почему два приведенных ниже утверждения приводят к другому результату? Что мне здесь не хватает?Проблема с простым встроенным кодом (python)

list = [1,2] 

if (item < 0 for item in list): 
    print "This prints." 

for item in list: 
    if item < 0: 
     print "This doesn't print." 
+1

'if (item <0 для элемента в списке):' заявление не имеет смысла. Вероятно, вам нужно что-то вроде 'if any (item <0 для элемента в списке):' – myaut

ответ

5

Первый - это выражение генератора, а правдивость будет определяться путем создания или отсутствия каких-либо предметов. Он будет печатать ровно один или один раз. В этом смысле вы получите одинаковое поведение для любого списка длин.

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

A (Hacky) обходной путь, чтобы сделать это один лайнер будет

>>> l = [-1, -2, 1, 2] 
>>> print('this prints\n' * len([item for item in l if item < 0])) 
this prints 
this prints 
+0

Ах спасибо, генераторы меня всегда путали. Нужно ли вообще менять выражение генератора, чтобы сделать то, что делает другой (но в одной строке)? –

+0

@ElConfuso Вы можете сократить цикл до следующей строки: 'для элемента в (элемент для элемента в списке, если элемент <0): print« Это не печатает ».' – Kritzefitz

0

Вашего первым, если это выражение генератора. Она всегда будет правда, потому что это не None:

alist = [1,2] 

if (item < 0 for item in alist): 
    print 'always be True' 
    print (item < 0 for item in alist) 

print (item < 0 for item in alist).next() 
print [i for i in (item < 0 for item in alist)] 

Ваш второй код нормально для логики.

Примечание: не используйте список в качестве имени переменной.