创建通过字典过滤的“ For循环”的最Python方式是什么?

Kyl*_*yle 3 python dictionary list-comprehension

我正在寻找并通过包含曲目列表的字典(名为:歌曲)附加一个项目。但是,该词典具有多个级别和索引。这是我的代码:

artists = []

for i in range(len(songs['tracks'])):
     artist.append(songs['tracks'][i]['artists'][0]['name'])
Run Code Online (Sandbox Code Playgroud)

有没有更多的pythonic方式来编写此代码?我觉得使用 in range(len(songs['tracks']))并非达到此目的的最佳方法,但这确实可以做到。

Pet*_*ris 5

与您的代码等效的一种解决方案可能是

artists = [track['artists'][0]['name'] for track in songs['tracks']]
Run Code Online (Sandbox Code Playgroud)


Sov*_*iut 5

首先,您实际上在执行的是“映射”操作(将一个数组的项目转换为另一个数组/列表),而不是“过滤器”操作(从数组/列表中删除与条件匹配的某些项目) )。

其次,您不应该在范围上循环。这是一个for in循环,而不是传统的for循环,因此没有索引。而是,每个迭代都在列表/数组中包含该项目。

artists = []
for track in songs['tracks']:
    artists.append(track['artists'][0]['name'])
Run Code Online (Sandbox Code Playgroud)

您可以使用列表推导将其转换为一个衬里。他们以迭代遍历列表以创建新列表为前提,可能会转换结果并可能过滤结果。他们使用的语法是:

result = [ <transformation> for item in items if <condition> ]
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您并不需要明确的条件,因为您只是将一组数组值映射到另一组数组,如下所示:

artists = [ track[artists][0]['name'] for track in songs['tracks'] ]
Run Code Online (Sandbox Code Playgroud)

但是,如果您要过滤,则条件将是您要使用的条件。例如

artists_with_long_songs = [ track[artists][0]['name'] for track in songs['tracks'] if track['length'] > 600 ]
Run Code Online (Sandbox Code Playgroud)