Какой самый питонный способ создать цикл «For Loop», который фильтрует по словарю? - PullRequest
3 голосов
/ 18 марта 2019

Я ищу для поиска, а затем добавить элемент через словарь (названный: песни), который содержит список треков.Тем не менее, этот словарь имеет несколько уровней и индексов.Вот мой код:

artists = []

for i in range(len(songs['tracks'])):
     artist.append(songs['tracks'][i]['artists'][0]['name'])

Есть ли более питонный способ написания этого кода?Я чувствую, что использование in range(len(songs['tracks'])) не лучший способ для достижения этой цели, но оно делает свою работу.

Ответы [ 2 ]

5 голосов
/ 18 марта 2019

Прежде всего, то, что вы делаете - это операция «map» (преобразование элементов одного массива в другой массив / список), а не операция «filter» (удаление определенных элементов, соответствующих условию, измассив / список).

Во-вторых, вы не должны зацикливаться на диапазоне.Это цикл 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 ]
5 голосов
/ 18 марта 2019

Одно решение, эквивалентное вашему коду, может быть

artists = [track['artists'][0]['name'] for track in songs['tracks']]
...