Почему функция не возвращает нужный список? - PullRequest
0 голосов
/ 22 сентября 2018

Мой код:

directions = ["north", "south", "east", "west"]
def scan(sentence):
    global sentence_list
    sentence_list = []
    sentence.split()
    for i in sentence:
        if i in directions:
            a = ('direction', i)
            sentence_list.append(a)
            del a
    return sentence_list

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

Вотмой вывод:

PS C:\Users\dell 3521\lpythw\ex48> nosetests
F
======================================================================
FAIL: tests.lexicon_tests.test_directions
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Users\dell 3521\AppData\Local\Programs\Python\Python36- 
 32\lib\site-packages\nose-1.3.7-py3.6.egg\nose\case.py
    ", line 198, in runTest
    self.test(*self.arg)
  File "C:\Users\dell 3521\lpythw\ex48\tests\lexicon_tests.py", line 5, in 
test_directions
    assert_equal(lexicon.scan("north"), [('direction', 'north')])
AssertionError: Lists differ: [] != [('direction', 'north')]

Second list contains 1 additional elements.
First extra element 0:
('direction', 'north')

- []
+ [('direction', 'north')]

----------------------------------------------------------------------
Ran 1 test in 0.021s

FAILED (failures=1)

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Метод str.split() не изменяет строку на месте.Вы должны присвоить возвращаемое значение str.split() переменной, или в этом случае вы можете просто перебрать ее вместо:

sentence_list = []
for i in sentence.split():
0 голосов
/ 22 сентября 2018

Вы должны переназначить sentence на возвращаемое значение sentence.split() или выполнить итерацию непосредственно над sentence.split(), поскольку метод str.split () не изменяет sentence на месте, новместо этого возвращает список.

Также вам не нужен оператор del a.

Измените код на

directions = ["north", "south", "east", "west"]

def scan(sentence):
    global sentence_list
    sentence_list = []
    for i in sentence.split():
        if i in directions:
            a = ('direction', i)
            sentence_list.append(a)

    return sentence_list 

Или еще более короткий путь - Понимание списка

directions = ["north", "south", "east", "west"]

def scan(sentence):
    global sentence_list
    sentence_list = [('direction', i) for i in sentence.split() if i in directions]

    return sentence_list

Вывод

>>> scan("north")
[('direction', 'north')]

И вы можете захотеть использовать в своем коде оператор global.Как объяснено в различных ресурсах , вы хотите избегать использования глобальных переменных для удобства чтения и поддержки вашего кода.

...