将名称与嵌套列表相关联

use*_*205 0 python list data-structures

我被困在如何将附加信息附加到列表叶的最低级别.我目前正在使用:

fruits = ['tomato', 'apple', 'watermelon']

fruit_detail = []

for fruit in fruits:
    fruit_detail.append([[fruit, [fruit + ' is delicious']]])
Run Code Online (Sandbox Code Playgroud)

这给了我:

[[['tomato', ['tomato is delicious']]], [['apple', ['apple is delicious']]], [['watermelon', ['watermelon is delicious']]]]
Run Code Online (Sandbox Code Playgroud)

稍后,我试图在列表中附加更多细节:

fruit_detail[tomato].append('red')
Run Code Online (Sandbox Code Playgroud)

我收到错误

NameError: name 'tomato' is not defined
Run Code Online (Sandbox Code Playgroud)

是否有可能实现我的目标?

Mar*_*ers 6

您应该使用字典:

fruit_detail = {}

for fruit in fruits:
    fruit_detail[fruit] = [fruit + ' is delicious']
Run Code Online (Sandbox Code Playgroud)

现在,您可以通过水果名称来解决每个列表:

>>> fruits = ['tomato', 'apple', 'watermelon']
>>> fruit_detail = {}
>>> for fruit in fruits:
...     fruit_detail[fruit] = [fruit + ' is delicious']
... 
>>> fruit_detail['tomato']
['tomato is delicious']
>>> fruit_detail['tomato'].append('red')
>>> fruit_detail['tomato']
['tomato is delicious', 'red']
Run Code Online (Sandbox Code Playgroud)

您的代码使用了不必要的额外列表,但只使用一个简单的列表来执行相同操作:

fruit_detail = []

for fruit in fruits:
    fruit_detail.append([fruit, [fruit + ' is delicious']])
Run Code Online (Sandbox Code Playgroud)

你必须首先扫描整个列表,甚至找到匹配的列表:

for fruit_name, fruit_info in fruit_detail:
    if fruit_name == 'tomato':
        fruit_info.append('red')
Run Code Online (Sandbox Code Playgroud)

这不是那么有效或易于使用.您添加的项目越多,搜索所需的时间就越长.另一方面,字典在查找与键关联的值时更加高效.

有关更多信息,请参阅Python教程的" 词典"部分.