我正在寻找,然后通过包含曲目列表的字典(名为:歌曲)附加一个项目。但是,该词典具有多个级别和索引。这是我的代码:
artists = []
for i in range(len(songs['tracks'])):
artist.append(songs['tracks'][i]['artists'][0]['name'])
是否有更多的Python方式编写此代码?我觉得好像在使用
in range(len(songs['tracks']))
并不是实现这一目标的最佳方法,但确实可以做到。
答案 0 :(得分:5)
一种等效于您的代码的解决方案可能是
artists = [track['artists'][0]['name'] for track in songs['tracks']]
答案 1 :(得分:5)
首先,您在执行的操作实际上是“映射”操作(将一个数组的项目转换为另一个数组/列表),而不是“过滤”操作(将匹配条件的某些项目从列表中删除)数组/列表)。
第二,您不应该在范围内循环。这是一个for in
循环,而不是传统的for
循环,因此没有索引。取而代之的是,每次迭代都在列表/数组中包含该项。
artists = []
for track in songs['tracks']:
artists.append(track['artists'][0]['name'])
您可以使用list comprehensions将其变成一个衬纸。他们以迭代遍历列表以创建新列表为前提,可能会转换结果并可能过滤结果。他们使用的语法是:
result = [ <transformation> for item in items if <condition> ]
在您的情况下,由于您只是将一组数组值映射到另一组,因此您并不需要明确的条件,就像这样:
artists = [ track[artists][0]['name'] for track in songs['tracks'] ]
但是,如果您要过滤,则条件将是您要使用的条件。例如
artists_with_long_songs = [ track[artists][0]['name'] for track in songs['tracks'] if track['length'] > 600 ]