TransWikia.com

¿Cómo obtener datos específicos de un diccionario?

Stack Overflow en español Asked by L.Bar5522 on December 16, 2021

Quiero extraer todas las canciones de varias playlists de Spotify, he hecho un request a la API de Spotify.

playlist_data = r.json()

Obtengo

{'playlists': {'href': 'https://api.spotify.com/v1/search?query=rewind-The%25&type=playlist&offset=0&limit=20',
  'items': [{'collaborative': False,
    'description': 'Remember what you listened to in 2010? Rewind and rediscover your favorites.',
    'external_urls': {'spotify': 'https://open.spotify.com/playlist/37i9dQZF1DXc6IFF23C9jj'},
    'href': 'https://api.spotify.com/v1/playlists/37i9dQZF1DXc6IFF23C9jj',
    'id': '37i9dQZF1DXc6IFF23C9jj',
    'images': [{'height': None,
      'url': 'https://i.scdn.co/image/ab67706f0000000327ba1078080355421d1a49e2',
      'width': None}],
    'name': 'Rewind - The Sound of 2010',
    'owner': {'display_name': 'Spotify',
     'external_urls': {'spotify': 'https://open.spotify.com/user/spotify'},
     'href': 'https://api.spotify.com/v1/users/spotify',
     'id': 'spotify',
     'type': 'user',
     'uri': 'spotify:user:spotify'},
    'primary_color': None,
    'public': None,
    'snapshot_id': 'MTU5NTUyMTQzOSwwMDAwMDAwMGQ0MWQ4Y2Q5OGYwMGIyMDRlOTgwMDk5OGVjZjg0Mjdl',
    'tracks': {'href': 'https://api.spotify.com/v1/playlists/37i9dQZF1DXc6IFF23C9jj/tracks',
     'total': 100} 

Estoy probando con este código para que devuelva ‘id’: ’37i9dQZF1DXc6IFF23C9jj’:

for playlists in playlist_data["playlists"]:
        for id in playlists["id"]:
            print (id)

Recibo el error:

TypeError: string indices must be integers

¿Cómo extraigo todas las canciones de estas playlists, sus id, nombre de la canción y artista?

2 Answers

Recibo el error:

TypeError: string indices must be integers

¿Por qué razón se obtiene el error?

Verás, iterar sobre los valores de un diccionarios no implica que la variable temporal tome el valor de cada par ordenado. Esto tiene sentido por que no hay manera de representar un solo par ordenado. Es decir, no es válido

llave: valor

Es necesario que esté entre llaves, para que sea interpretable.

¿Realmente que valor toma la variable al iterar sobre un diccionario?

Las respuesta es que toma el valor de las llaves, es decir un string. Por lo tanto una expresión como un ciclo anidado sobre los valores de un diccionario, sería equivalente a iterar sobre las letras de un string:

diccionario = {"Llave": "valor"}

for llave in diccionario:
    for letra in llave:
        print(letra)

mostraría

L
l
a
v
e

Lo que está ocurriendo es lo siguiente:

diccionario => for => llave como string => for => cada letra del string

La variable del primer ciclo toma el valor de cada llave (string) mientras, que la variable del segundo ciclo toma el valor de cada letra de dicha llave.

Dicho esto el error tiene más sentido. La expresión

for playlists in playlist_data["playlists"]:
        for id in playlists["id"]:
            print (id)

Estaría dando las instrucciones

  1. Por cada llave en el valor de la llave "playlists" en el diccionario playlist_data
  2. Por cada letra en la llave de la llave en el valor de la llave "playlists" en el diccionario playlist_data
  3. Imprime la letra

Como es de esperar, terminará en error. Esto por que los indices de un string tienen que ser números enteros, osea que el indice "id" no es válido. Sería como decir

print("string"["letra"])

Dicho esto, surge otra pregunta: ¿Es necesaria está iteración?

¿Como obtener datos específicos de un diccionario?

  • Para referirse a una llave de un diccionario se usan corchetes y adentro el nombre de la llave como cadena.
  • Para referirse al indice de una lista se usan corchetes y adentro un número entero:

El primer indice de izquierda a derecha equivale a 0 y último índice de derecha a izquierda equvale a -1

 0  1  2  3
 |  |  |  |
 *  *  *  *
[1, 2, 3, 4]
 *  *  *  *
 |  |  |  |
-4 -3 -2 -1
  • Se puede decir que las cadenas son listas de caracteres.

¿Cómo extraigo todas las canciones de estas playlists?

Debes de localizarlo en el diccionario. Analizando el diccionario, te darás cuenta que la llave "tracks" está dentro del diccionario que está en la lista que tiene como valor "items", que es una llave que tiene el diccionario que tiene como valor la llave "playlists".

Por lo tanto con:

canciones = playlist_data["playlists"]["items"][0]["tracks"]

Se obtendría

{'href': 'https://api.spotify.com/v1/playlists/37i9dQZF1DXc6IFF23C9jj/tracks', 'total': 100}

Si se deseara obtener el enlace, solo basta con añadir la especificación de la llave "href"

playlist_data["playlists"]["items"][0]["tracks"]["href"]

¿Cómo extraigo todas las canciones de estas playlists, sus id, nombre de la canción y artista?

De esta misma manera, se puedes obtener cualquier elemento del diccionario. Eso ya te toca hacerlo a ti.

Espero haberte ayudado.

Answered by user166844 on December 16, 2021

Ver los datos de esta forma puede ser muy complicado a menos que llevas los resultados a un visualizador de JSON. Puedes hacer lo mismo en Python con:

import json

print(json.dumps(playlist_data, indent=4))

Por otro lado, al ver la estructura de la respuesta verás por que el código falla. Al incocar a playlista_data['playlist'] lo que hace es retornar las llaves del diccionario interno que son 'href' y 'items' como str.

Por otro lado, id es una palabra reservada en Python. En lugar de eso, utilizar id_.

Lo que tienes que hacer es ir navegando la estructura con indices concatenados de esta forma:

playlist_data['playlists']['items'][0]['id']

Esto te retornará el id del playlist

Answered by Luis Munoz on December 16, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP