Использование Python для извлечения словарных ключей в списке

Я получил список при вводе следующего URL-адреса: http://api.twitter.com/1/trends/44418.json

Список содержит несколько словарей, и я немного запутался со структурой списка. Я пытаюсь получить значения, связанные с ключом "name".

Например:

"имя": "# throwagrenade"   "имя": "Ребекка Блэк"   "Название": "# questionsihate"

Я могу написать код сам, я просто пытаюсь концептуально понять, как получить доступ к словарям (и их парам ключ/значение) в списке.

Ответ 1

Первое, что я хотел бы сделать, работая с большим куском json, - попытаться перевести его в более читаемый формат. Этот онлайн-инструмент форматирования json должен выполнить эту работу.

Вот код, который получит все имена трендов:

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']

Или вы можете сделать все это в одной строке:

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

for name in names:
    print name

Оба приведут к:

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

Соответствующее чтение:

Python docs на json (хотя вам действительно нужно только json.loads())

разделы Dive Into Python на lists и dictionaries.

Ответ 2

Ну, для начала эта ссылка дает вам JSON, поэтому вам нужно десериализовать его с помощью библиотеки json:

data = json.loads(response_data)

Теперь у вас просто есть список словарей. Вы можете легко перебирать список с помощью цикла for. На каждой итерации у вас есть нормальный словарь, из которого вы можете получить значение, соответствующее клавише name, с обычным синтаксисом словаря.

Вы можете сделать все сразу сразу с простым пониманием списка:

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

Ответ 3

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']]

приводит к

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']

Ответ 4

Это файл JSON, поэтому вам нужно использовать анализатор JSON для его чтения. Существует парсер в Python 2.7 - просто import json. С помощью этой структуры вы можете манипулировать ею с Python.

Если вам действительно все равно, где в структуре находятся клавиши name, вы можете либо пройти через дерево, ищущее их (if key == "name"), либо, возможно, использовать регулярное выражение.

Регулярное выражение будет больно, однако, из-за необходимости включать экранированные символы в соответствие.