NameError, когда я пытаюсь добавить значения - PullRequest
0 голосов
/ 21 июня 2020

Подскажите, пожалуйста, почему он не находит num в коде:

from collections import defaultdict
import re

result = defaultdict(list)

for l in my_list:
    k = None
    for v in l:
        if v in keywords:
            k = v
        if re.match(r'[0-9,.]+$', v):
            num = v
    if k is not None:
        result[k].append(num)

Ошибка:

> --------------------------------------------------------------------------- NameError                                 Traceback (most recent call
> last) <ipython-input-84-31a1ed6e427e> in <module>
>      12             num = v
>      13     if k is not None:
> ---> 14         result[k].append(num)
>      15 
> 
> NameError: name 'num' is not defined

Я не могу понять эту ошибку.

Ответы [ 4 ]

2 голосов
/ 21 июня 2020

В вашем коде num = v не всегда выполняется, он запускается только тогда, когда условие if равно True. Сначала инициализируйте num нулевым значением, это решит ошибку.

from collections import defaultdict
import re

result = defaultdict(list)
num = 0
for l in my_list:
    k = None
    for v in l:
        if v in keywords:
            k = v
        if re.match(r'[0-9,.]+$', v):
            num = v
    if k is not None:
        result[k].append(num)
1 голос
/ 21 июня 2020

Я разместил комментарии в приведенном ниже коде. условие «if» никогда не выполнялось, поэтому переменная num никогда не инициализировалась.

     if re.match(r'[0-9,.]+$', v): # this if condition never got true
         num = v     # the initialization never executed

также было бы неплохо проверить «re.match ()» документацию . \

Почему условие if никогда не выполнялось, потому что в вашем коде вы никогда не включали '$' внутри класса символов.

if re.match(r'[0-9,.]+$', v): # the $ should be inside [0-9,.,$]
                num = v

'$' это обычно метасимвол, но внутри класса символов он лишен своей особой природы . Я пробовал использовать свою строку.

import re
String = "0,1,2,3,4,5,6,7,8,9,.,$"

if re.match(r"[0-9,.,$]", String):# $ should be inside character class
    print("matched") # this print statement executes output is `matched`
else:
    print("not matched") 

Вывод моего кода напечатает matched

1 голос
/ 21 июня 2020

Это просто:

from collections import defaultdict
import re

result = defaultdict(list)

for l in my_list:
    k = None
    for v in l:
        if v in keywords:
            k = v
        if re.match(r'[0-9,.]+$', v): # Here is an if statement, and num only gets defined if the condition meets it
            num = v
    if k is not None:
        result[k].append(num)

Если этот if оператор, который я прокомментировал, никогда не встречается, num никогда не будет определен.

1 голос
/ 21 июня 2020

Переменная создается только в том случае, если ваш статус верен:

if re.match(r'[0-9,.]+$', v):
        num = v

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...