[英]What is the most pythonic way to create a 'For Loop' that filters through a dictionary?
我期待搜索,然后通过包含轨道列表的字典(名为:歌曲)附加项目。 但是,这本词典有多个级别和索引。 这是我的代码:
artists = []
for i in range(len(songs['tracks'])):
artist.append(songs['tracks'][i]['artists'][0]['name'])
是否有更多pythonic方式编写此代码? 我觉得好像in range(len(songs['tracks']))
使用in range(len(songs['tracks']))
并不是实现这一目标的最好方法,但它确实起到了作用。
一个等同于您的代码的解决方案可能是
artists = [track['artists'][0]['name'] for track in songs['tracks']]
首先,你在那里做的实际上是一个“map”操作(将一个数组的项转换为另一个数组/列表),而不是“过滤”操作(从数组/列表中删除与条件匹配的某些项目) )。
其次,你不应该在一个范围内循环。 这是for in
循环,而不是传统的for
循环,因此没有索引。 相反,每次迭代都包含列表/数组中的项目。
artists = []
for track in songs['tracks']:
artists.append(track['artists'][0]['name'])
您可以使用列表推导将其转换为单行。 它们采用迭代列表的公共前提来创建新列表,可能会转换结果并可能过滤结果。 他们使用的语法是:
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 ]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.