Как перебрать вложенный dict в Python? - PullRequest
0 голосов
/ 05 мая 2018

У меня есть список из 2 словарей, которые содержат 3 словаря, и мне нужно создать список с ключом base или любым другим ключом внутри 3 словарей. Конечный результат будет примерно таким:

>>> bases[0]
['BCH', 'BCH', 'BCC']

>>> bases[1]
['ZEC', 'ZRX', 'ZAC']

Вот так выглядит мой список:

>>> markets_details
{
    'BCH/BTC': {
        'active': True,
        'altname': 'BCHXBT',
        'base': 'BCH',   
        'darkpool': False
    },
    'BCH/EUR': {
        'active': True,
        'altname': 'BCHEUR',
        'base': 'BCH',
        'darkpool': False
    },
    'BCC/EUR': {
        'active': True,
        'altname': 'BCCEUR',
        'base': 'BCC',
        'darkpool': False
    }
},{
    'ZEC/BTC': {
        'active': True,
        'altname': 'ZECXBT',
        'base': 'ZEC',
        'darkpool': False
    },
    'ZRX/EUR': {
        'active': True,
        'altname': 'ZRXEUR',
        'base': 'ZRX',
        'darkpool': False
    },
    'ZAC/EUR': {
        'active': True,
        'altname': 'ZACEUR',
        'base': 'ZAC',
        'darkpool': False
    }
}

Я могу создать список символов с помощью:

>>> symbols = [list(m.keys()) for m in markets_details]

Но я не могу создать список с ключом base. Для меня это должно работать, что я делаю неправильно?

>>> bases = [m[k for k in list(m.keys())]['base'] for m in markets_details]

Для каждого обмена m Я создаю список символов с помощью list(m.keys()), выбираю каждый символ k, затем получаю доступ к клавише [base].

Спасибо

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Решение без split будет:

[[pair['base'] for pair in market.values()] for market in markets_details]
0 голосов
/ 05 мая 2018

Лучший способ проработать логику для себя - это создать длинный вложенный цикл for:

res = []
for d1 in markets_details:
    for _, d2 in d1.items():
        for k, v in d2.items():
            if k == 'base':
                res.append(v)

print(res)

['BCH', 'BCH', 'BCC', 'ZEC', 'ZRX', 'ZAC']

Сделав это, вы можете написать логику для вашего эквивалентного понимания списка:

res = [sub_dict['base'] for d in markets_details for sub_dict in d.values()]

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

res = [[sub_dict['base'] for sub_dict in d.values()] for d in markets_details]

print(res)

[['BCH', 'BCH', 'BCC'], ['ZEC', 'ZRX', 'ZAC']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...