2015-10-06 2 views
-4

Почему возникает следующее поведение? Я ожидаю, что результат будет только 1.Неожиданное поведение if/else в понимании списка

In [77]: a = 1 

In [78]: [a if a else s for s in [0, 1,0]] 
Out[78]: [1, 1, 1] 

Поскольку a не опустошить значение в списке должно быть только a. Здесь else должен выполняться только в том случае, если a является None.

EDIT: Я хочу, чтобы вставить a в списке, если a не None, иначе вставить s в списке.

+1

Я думаю, что вы хотели '[s для s в [0, 1, 0], если s == a]' (или просто '... if s]', так как '1' является правдой-y и '0' - false-y). Непонятно, почему вы ожидали, что код, который вы опубликовали, будет иметь другой результат. – jonrsharpe

+0

@jonrsharpe Nope. Я хочу вставить a в список, если a не None, иначе вставьте s в список. –

+0

Можете ли вы лучше объяснить, что хотите? – Kasramvd

ответ

1

a if a else s оценивает по: a если это правда. a никогда не меняется, поэтому, независимо от того, что вы повторяете в понимании списка, вы получите то же самое: список a s до тех пор, пока вы повторяете.


Возможно, вы хотите это?

[a] if a else [0, 1, 0] 

Это выражение будет вычисляться в список с a в нем, если a является truthy, в противном случае она будет вычисляться в списке вы предоставили.

2

Это нормальное поведение. Вы повторяете список, содержащий три цифры. if a всегда верно. Таким образом, a if a выполнен три раза. Вот почему вы добавили три списка: a.

Что касается вашего последнего редактирования:

Я хочу, чтобы вставить в список, если не является None, иначе вставка s в списке.

Хорошо, тогда вы это делаете:

res=[] 
if a: 
    res.append(a) 
else: 
    for s in [0,1,0]: 
     res.append(s) 
+0

Не может быть сделано со списком? –

0

Там нет необходимости ставить еще внутри скобок.

>>> a = 1 
>>> [a] if a else [0, 1, 0] 
[1] 
>>> a = None 
>>> [a] if a else [0, 1, 0] 
[0, 1, 0] 
+0

@jonrsharpe true, я этого даже не заметил. –

+0

Это даст вам выражение генератора в списке! – jonrsharpe

+0

@jonrsharpe ugh, Мне нужно подумать, прежде чем открывать клавиатуру. Вы должны предоставить свой собственный ответ с комментарием, который вы удалили, я бы дал ему преимущество. –

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