什么是NameError,我该如何解决?

问题描述 投票:-2回答:2

我已经定义了一个函数返回某些事件的索引列表中。然而,当我尝试运行我的文档测试,它返回一个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

我不明白我的代码部分是导致此。

python
2个回答
1
投票

你的错误是在这里:

for value in item:
    value += 1

itemshoes列表的元素,shoes的所有元素都是字符串。你可以不为整数添加到字符串。所以value += 1引发错误,正因为如此全功能失效。你永远没有return变量。从这里的错误。

乍一看,你并不需要在所有的两条线,你永远不使用后value。尝试将其删除。

编辑

如果这些线背后的含义是由1提高每个索引值,因为我从文档字符串怀疑(感谢@ekhumoro让我认识到这一点),你可以编辑列表理解,实现预定的目标。

indices = [i+1 for i, x in enumerate(shoes) if x == item]

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
    """
    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.
© www.soinside.com 2019 - 2024. All rights reserved.