2016-05-22 2 views
0

Следующие циклы возвращает значение 3 для count параметра:В чем разница между пониманием списка Python и нормальным циклом?

for line in textfile.text.splitlines(): 
    count += 1 if 'hostname' in line else 0 

Однако пытается сделать то же самое с помощью списка возвращает 1:

count += 1 if ['hostname' in line for line in textfile.text.splitlines()] else 0 

Где я ошибся?

+0

FYI, это называется понимание списка, а не однострочный цикл. –

ответ

2

Сводки списков являются ярлыками для создания списка. Ниже (примерно) эквивалент:

result = [] 
for item in l: 
    if condition(item): 
     result.append(item.attribute) 

result = [item.attribute for item in l if condition(item)] 

Так что ваш код

count += 1 if ['hostname' in line for line in textfile.text.splitlines()] else 0 

будет такой же, как

result = [] 
for line in textfile.text.splitlines(): 
    result.append('hostname' in line) 

count += 1 if result else 0 

, который, очевидно, не то же самое, как

for line in textfile.text.splitlines(): 
    count += 1 if 'hostname' in line else 0 

вместо этого вы могли бы делать что-то подобный

count += sum([1 for line in textfile.text.splitlines() if 'hostname' in line]) 
1

Попробуйте это -

count += len([line for line in textfile.text.splitlines() if 'hostname' in line]) 
+1

безупречный! благодаря! –

0

Это происходит потому, что во втором случае ваш, если условие выполняется только один раз.

ваше второе утверждение означает count + = 1, если listobject else 0;

Здесь объект списка не является None, поэтому count + = 1 выполняется один раз.

Смежные вопросы