我已经定义了一个函数返回某些事件的索引列表中。然而,当我尝试运行我的文档测试,它返回一个NameError,而是意味着有与它没有任何问题“退出代码0”退出。
def build_placements(shoes):
"""Return a dictionary where each key is a company, and each value
is a list of placements by people wearing shoes made by that company.
>>> result = build_placements(['Saucony', 'Asics', 'Asics', 'NB', 'Saucony', 'Nike', 'Asics', 'Adidas', 'Saucony', 'Asics'])
>>> result == {'Saucony': [1, 5, 9], 'Asics': [2, 3, 7, 10], 'NB': [4], 'Nike': [6], 'Adidas': [8]}
True
"""
empty_dict = {}
for item in shoes:
indices = [i for i, x in enumerate(shoes) if x == item]
for value in item:
value += 1
empty_dict[item] = indices
return empty_dict
if __name__ == '__main__':
import doctest
doctest.testmod()
运行此之后,我收到此错误信息:
NameError: name 'result' is not defined
我不明白我的代码部分是导致此。
你的错误是在这里:
for value in item:
value += 1
item
是shoes
列表的元素,shoes
的所有元素都是字符串。你可以不为整数添加到字符串。所以value += 1
引发错误,正因为如此全功能失效。你永远没有return
变量。从这里的错误。
乍一看,你并不需要在所有的两条线,你永远不使用后value
。尝试将其删除。
编辑
如果这些线背后的含义是由1提高每个索引值,因为我从文档字符串怀疑(感谢@ekhumoro让我认识到这一点),你可以编辑列表理解,实现预定的目标。
indices = [i+1 for i, x in enumerate(shoes) if x == item]
我写了一个短
def build_placements(shoes):
"""Return a dictionary where each key is a company, and each value
is a list of placements by people wearing shoes made by that company.
>>> result = build_placements(['Saucony', 'Asics', 'Asics', 'NB', 'Saucony', 'Nike', 'Asics', 'Adidas', 'Saucony', 'Asics'])
>>> result == {'Saucony': [1, 5, 9], 'Asics': [2, 3, 7, 10], 'NB': [4], 'Nike': [6], 'Adidas': [8]}
True
"""
return {i:[j+1 for j,k in enumerate(shoes) if k == i] for i in set(shoes)}
if __name__ == '__main__':
import doctest
doctest.testmod(verbose=True)
这是生产
Trying:
result = build_placements(['Saucony', 'Asics', 'Asics', 'NB', 'Saucony', 'Nike', 'Asics', 'Adidas', 'Saucony', 'Asics'])
Expecting nothing
ok
Trying:
result == {'Saucony': [1, 5, 9], 'Asics': [2, 3, 7, 10], 'NB': [4], 'Nike': [6], 'Adidas': [8]}
Expecting:
True
ok
1 items had no tests:
__main__
1 items passed all tests:
2 tests in __main__.build_placements
2 tests in 2 items.
2 passed and 0 failed.
Test passed.