2015-11-13 7 views
4

Как сделать следующее в понимании списка?Понимание списка с помощью else pass

test = [["abc", 1],["bca",2]] 

result = [] 
for x in test: 
    if x[0] =='abc': 
     result.append(x) 
    else: 
     pass 
result 
Out[125]: [['abc', 1]] 

Попробуйте 1:

[x if (x[0] == 'abc') else pass for x in test] 
    File "<ipython-input-127-d0bbe1907880>", line 1 
    [x if (x[0] == 'abc') else pass for x in test] 
           ^
SyntaxError: invalid syntax 

Попробуйте 2:

[x if (x[0] == 'abc') else None for x in test] 
Out[126]: [['abc', 1], None] 

Попробуйте 3:

[x if (x[0] == 'abc') for x in test] 
    File "<ipython-input-122-a114a293661f>", line 1 
    [x if (x[0] == 'abc') for x in test] 
          ^
SyntaxError: invalid syntax 
+1

Hi WoodChopper. Фактически, в цикле for, если условие выполнено, что-то делается, если оно не выполняется, ничего не сделано ... Так что else: pass является избыточным. – Jblasco

+0

@Jblasco: Спасибо, моя первая попытка была «Попробовать 3», но только не в правильном порядке, как упоминалось в jaco. – WoodChopper

ответ

10

The if должно быть в конце, и вы не нужен pass в списке comp rehension. Элемент будет добавлен только в том случае, если выполнено условие if, иначе элемент будет проигнорирован, поэтому pass неявно реализован в синтаксисе понимания списка.

[x for x in test if x[0] == 'abc'] 

Для полноты выхода этого утверждения:

[['abc', 1]] 
+0

Спасибо !. Я потратил 30 минут на поиски везде :) – WoodChopper

3

В дополнение к ответу Жако; это приятно знать о команде filter потому, что вы в основном хотят это фильтрация список:

filter(lambda x: x[0]=='abc', test) 

, которая возвращает:

  • список в Python 2
  • генератор в Python3 (которые могут быть полезны для очень длинных списков, поскольку вы можете позже обрабатывать результат без перегрузки памяти); если вы все еще хотите список, просто оберните функцию filter выше с помощью конструктора list().
Смежные вопросы