如何在Python中迭代嵌套的dict?

时间:2018-05-05 11:35:23

标签: python python-3.x dictionary

我有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 :(得分:2)

为自己计算逻辑的最佳方法是构造一个长形式的嵌套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']]

如果您需要确定哪些字典结果来源,您可以重新构建列表推导以包含嵌套列表:

{{1}}

答案 1 :(得分:2)

没有split的解决方案是:

[[pair['base'] for pair in market.values()] for market in markets_details]