Как правильно распарсить json

Не могу разобраться как этот json распарсить в массив..

response = requests.get(config.PRIVAT_ECHANGE).text
data = json.loads(response)


[
    {
        "ccy":"RUR",
        "base_ccy":"UAH",
        "buy":"0.28000",
        "sale":"0.32000"
    },
    {
        "ccy":"EUR",
        "base_ccy":"UAH",
        "buy":"19.20000",
        "sale":"20.00000"
    },
    {
        "ccy":"USD",
        "base_ccy":"UAH",
        "buy":"15.50000",
        "sale":"15.85000"
    }
]

пытаюсь записать его в массив

exchanges = []

for item in data:
    exchanges += item

но получаеться

['ccy', 'base_ccy', 'buy', 'sale', 'ccy', 'base_ccy', 'buy', 'sale', 'ccy', 'base_ccy', 'buy', 'sale']

а я хочу чтобы в идеале при вызове было так

exchanges[0][ccy] + " " + 
exchanges[0][base_ccy] + " " + 
exchanges[0][buy] + " " + 
exchanges[0][sale]

Это будет код за один курс валют..


Ответы (2 шт):

Автор решения: Sergey K.

В вашем решении ошибка. Во-первых, при попытке итерировать в цикле dict, то итерируются ключи, а не значения.
Во-вторых, Вам следовало этот кусочек с конкатенацией вставить как раз в цикле, итерируете список.
Приведу более изящное решение с генератором списков.

d = [
    {
        "ccy":"RUR",
        "base_ccy":"UAH",
        "buy":"0.28000",
        "sale":"0.32000"
    },
    {
        "ccy":"EUR",
        "base_ccy":"UAH",
        "buy":"19.20000",
        "sale":"20.00000"
    },
    {
        "ccy":"USD",
        "base_ccy":"UAH",
        "buy":"15.50000",
        "sale":"15.85000"
    }
]

# с помощью генератора списков формируем список со строками
# с использование f-строк
o = [f'{r["ccy"]} {r["base_ccy"]} {r["buy"]} {r["sale"]}' for r in d]

Вывод: ['RUR UAH 0.28000 0.32000', 'EUR UAH 19.20000 20.00000', 'USD UAH 15.50000 15.85000']

Если нужно, чтобы каждая строка была разделена в списке, то вот вариант:

o2 = [(r["ccy"], r["base_ccy"], r["buy"], r["sale"]) for r in d]

Вывод следующий: [('RUR', 'UAH', '0.28000', '0.32000'), ('EUR', 'UAH', '19.20000', '20.00000'), ('USD', 'UAH', '15.50000', '15.85000')]

Теперь список содержит кортежи (массивы), где лежат по отдельности значения на каждую строку

→ Ссылка
Автор решения: Сергей Кох

Ну начнем с того, что это не json, это список словарей. Если вы хотите получить таблицу, то лучше использовать Pandas.

import pandas as pd


data = [
    {
        "ccy":"RUR",
        "base_ccy":"UAH",
        "buy":"0.28000",
        "sale":"0.32000"
    },
    {
        "ccy":"EUR",
        "base_ccy":"UAH",
        "buy":"19.20000",
        "sale":"20.00000"
    },
    {
        "ccy":"USD",
        "base_ccy":"UAH",
        "buy":"15.50000",
        "sale":"15.85000"
    }
]

df = pd.DataFrame(data)
print(df)
   ccy base_ccy       buy      sale
0  RUR      UAH   0.28000   0.32000
1  EUR      UAH  19.20000  20.00000
2  USD      UAH  15.50000  15.85000

Элементы извлекаются просто:

print(df['sale'])
print(df['buy'][1])
0     0.32000
1    20.00000
2    15.85000
Name: sale, dtype: object
19.20000
→ Ссылка