2011-03-15 19 views
11

he recibido una lista cuando se introduce la siguiente URL - http://api.twitter.com/1/trends/44418.jsonutilizar Python para extraer las claves de diccionario dentro de una lista

La lista contiene múltiples diccionarios, y estoy un poco confundido con la estructura de la lista. Estoy tratando de obtener los valores asociados con la tecla 'nombre'.

Por ejemplo:

"name": "# throwagrenade" "name": "Rebecca Negro" "name": "# questionsihate"

puedo escribir el código de mí mismo,' Estoy tratando de entender conceptualmente cómo acceder a los diccionarios (y sus pares clave/valor) dentro de una lista.

+0

Sólo una nota, gorjeo utiliza un API v1.1 ahora que requiere autenticación. Puede leer más sobre cómo acceder a las tendencias [aquí] (https://dev.twitter.com/docs/api/1.1#110). – philshem

Respuesta

22

La primera cosa que haría cuando se trabaja con un gran trozo de JSON, es tratar de llegar a un formato más legible . This online json formatting tool debería hacer el trabajo.

Aquí hay un código que hará que todos los nombres de tendencia:

import urllib2 
import json 

url = 'http://api.twitter.com/1/trends/44418.json' 

# download the json string 
json_string = urllib2.urlopen(url).read() 

# de-serialize the string so that we can work with it 
the_data = json.loads(json_string) 

# get the list of trends 
trends = the_data[0]['trends'] 

# print the name of each trend 
for trend in trends: 
    print trend['name'] 

o puede hacerlo todo en una sola línea:

names = [trend['name'] for trend in the_data[0]['trends']] 

for name in names: 
    print name 

Ambos se traducirá en:

 
#throwagrenade 
Rebecca Black 
Eric Abidal 
#questionsihate 
#juniordoctors 
Smiley Culture 
Lily Allen 
Wes Brown 
Pandev 
Ray Wilkins 

Lecturas relevantes:

Python docs on json (aunque se debe en realidad sólo necesita json.loads())

Dive Into Python secciones 's en lists y dictionaries.

+0

gracias! gran respuesta, aprecia el material de lectura extra también. –

+0

También recomendaría el nuevo [Dive Into Python 3] (https://diveintopython3.ep.io/) - los diccionarios y las listas se mencionan en la sección [Capítulo 2. Tipos de datos nativos] (https: //diveintopython3.ep .io/native-datatypes.html). – joweiser

1

Es un archivo JSON, por lo que debe usar un analizador JSON para leerlo. Hay a parser en Python 2.7 - solo import json. Con esa estructura, puedes manipularla desde Python.

Si realmente no te importa en qué parte de la estructura están las claves name, puedes recurrir a través del árbol buscándolas (if key == "name"), o quizás usar una expresión regular.

La expresión regular será muy dolorosa, debido a la necesidad de incluir caracteres escapados en un partido.

+0

¡La idea de usar una expresión regular me da dolor de cabeza solo de pensarlo! – Acorn

8

Bueno, para empezar, que enlazan le da JSON, por lo que necesita para deserializar con la biblioteca json:

data = json.loads(response_data) 

Ahora simplemente tienes una lista de diccionarios. Puede iterar fácilmente a través de la lista con un bucle for. En cada iteración, tiene un diccionario normal, del cual puede obtener el valor correspondiente a la clave name con la sintaxis usual del diccionario.

Puede hacerlo todo a la vez con una lista simple de comprensión:

names = [item['name'] for item in data] 
+1

La lista de diccionarios que contienen los nombres no está en la raíz de los datos, están en '[0] ['trends']' – Acorn

4
import urllib2 
import json 

url = 'http://api.twitter.com/1/trends/44418.json' 
data = urllib2.urlopen(url).read() 
j = json.loads(data) 

names = [d['name'] for d in j[0]['trends']] 

resultados en

names = [u'#throwagrenade', u'Rebecca Black', u'#questionsihate', 
    u'#thingsthatdontgotogether', u'Eric Abidal', u'Smiley Culture', 
    u'Ray Wilkins', u'Wes Brown', u'Twenty Twelve', u'Marseille'] 
Cuestiones relacionadas