2016-04-17 4 views
0

Может кто-то помочь мне исправить этот список понимание:список ошибок понимания

line_list = [line for line in file.splitlines() if item in line for item in my_list] 

Потому что я получаю следующую ошибку

UnboundLocalError: local variable 'item' referenced before assignment 

ответ

3

у вас есть немного омлет:

line_list = [line for line in file.splitlines() for item in my_list if item in line] 

Фильтр идет в конце.

Также обратите внимание, что указанное выше может содержать несколько повторяющихся строк в строке, если в my_list имеется более одного совпадения. Далее будет проверить, есть ли какие-либо матчи, а затем добавить строку только один раз:

line_list = [line for line in file.splitlines() if any(item in line for item in my_list)] 
+0

делает 'any' короткое замыкание типа' next', как только есть один элемент итератора, для которого выражение имеет значение True? –

+1

Да, 'any()' и 'all()' будут замыкаться на короткое замыкание. – TigerhawkT3

2

ПОЛНАЯ петли выглядеть следующим образом:

line_list = [] 
for line in file.splitlines(): 
    for item in my_list: 
     if item in line: 
      line_list.append(line) 

Поместить в одной и той же линии, что-то вроде этого (не истинный синтаксис Python):

line_list = [] 
for line in file.splitlines(): for item in my_list: if item in line: line_list.append(line) 

конечно, .append() часть является общей для всех постижений, поэтому мы поместили его в начале:

line_list = [line for line in file.splitlines() for item in my_list if item in line] 

Если вы просто думаете о подобных списках, то должно быть легко выяснить, какой порядок используется.

Не позволяйте этому путать вас, когда у вас есть else заявлений. Например:

line_list = [] 
for line in file.splitlines(): 
    if line == "yes": 
     line_list.append("no") 
    else: 
     line_list.append(line) 

будет интерпретироваться:

line_list = ["no" if line == "yes" else line for line in file.splitlines()] 

с if - else в самом начале. Зачем? ты спрашиваешь. Ну, это могло быть написано так:

line_list = [] 
for line in file.splitlines(): 
    line_list.append("no" if line == "yes" else line) 

Вы видите, часть в начале понимания все еще такой же, как то, что передается в .append(). Предложение else не является частью синтаксиса для понимания; это отдельная особенность языка.


@ TigerhawkT3 сделал хорошую точку об использовании any(), хотя.

+0

Очень интересное/ясное объяснение того, как интерпретировать понимание! –

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