Почему этот цикл for возвращает список другого размера, чем ожидалось?

#python #numpy #spotipy

#python #numpy #spotipy

Вопрос:

Я выполняю проект анализа данных с использованием библиотек spotipy и numpy. Я выяснил, как достичь ожидаемого результата, но я не знаю точно, почему небольшое изменение (с использованием цикла for) в моем коде приводит к тому, что он не работает. вот мой код:

 def get_user_playlist(username, playlist_id, sp):
    offset=0
    playlist_songs = sp.user_playlist_tracks(username, playlist_id, limit=100, fields=None, offset=offset, market=None)['items']
    
    return playlist_songs

def create_dataframe(playlist_songs):
    
    playlist_df_columns = ['artist','track_name','id','explicit','duration','danceability','loudness','tempo']
    
    #audio_analysis_columns = ['danceability','loudness','tempo']
    playlist_df = pd.DataFrame(columns=df_columns)
    # song = dict object containing song
    
    playlist_df['artist'] = np.array([song['track']["album"]["artists"][0]["name"] for song in playlist_songs])
    playlist_df['track_name'] = np.array([song['track']['name'] for song in playlist_songs])
    playlist_df['id'] = np.array([song['track']['id'] for song in playlist_songs])
    playlist_df['explicit'] = np.array([song['track']['explicit'] for song in playlist_songs])
    
    
    for song in playlist_songs:
        
        audio_analysis = sp.audio_features(song['track']['id'])
    
    #returning audio_analysis for testing purposes.
    return audio_analysis
    #return playlist_df

  

важной частью является цикл for, когда я запускаю этот код, длина audio_analysis списка = 1 :

 for song in playlist_songs:
        audio_analysis = sp.audio_features(song['track']['id'])
  

Однако это работает, когда я удаляю цикл for и делаю это вместо этого, длина audio_analysis списка = 94, как и ожидалось.:

 audio_analysis = sp.audio_features(playlist_df['id'])
  

Для справки, вот код, который выводит длину:

 playlist = get_user_playlist('username', 'playlist_name', sp)
audio_analysis = create_dataframe(playlist)
print(len(audio_analysis))
  

Мой вопрос таков: почему цикл for работает не так, как я ожидаю? Мой код не имеет доступа к той же информации? Почему использование цикла for для доступа к информации не совпадает с использованием playlist_df['id'] столбца напрямую?

Комментарии:

1. Каждый раз в цикле, который вы заменяете audio_analysis . Итак, в конце он просто содержит значение из последней песни.

2. Вторая версия создает df, который содержит значения из каждой песни в playlist_df

3. О да!!! Я только что изменил его сейчас, чтобы он каждый раз добавлялся в список, и это работает! Хотя запуск намного медленнее. Большое спасибо 🙂 Надеюсь, у вас отличный день! @Barmar