【问题标题】:Nested dictionary comprehension combined with using values as key:value嵌套字典理解结合使用值作为键:值
【发布时间】:2020-05-19 18:34:59
【问题描述】:

我有一个如下格式的数据结构:

dict = {
        garbage1:{currency: 'JPY', maturity: 20apr2021, yield:-0.50%}, 
        garbage2:{currency: 'JPY', maturity: 30mar2022, yield:-0.2%},
        garbage3:{currency: 'EUR', maturity: 15may2021, yield: +0.1%}
       }

我想变成这样

new_dict = {
            'JPY': {20apr2021:-0.50%, 30mar2022,-0.20%},
            'EUR': {15may2021:+0.1%}
           }

所以我尝试使用嵌套字典理解并将其与将值转换为键值相结合。挣扎。这是迄今为止我能到达的最远距离:

new_dict = {outer_val: {inner_val["maturity"]: inner_val["yield"] for inner_key, inner_val in outer_val.items()}
            for outer_key, outer_val in dict.items()}

【问题讨论】:

  • 您的 dict 示例不是有效的 Python,您要创建的 new_dict 也不是。
  • 是的,我很抱歉,伪代码很差。货币、期限和收益率都应该是字符串。

标签: python dictionary nested dictionary-comprehension


【解决方案1】:

你可以用循环来做到这一点:

new_dict = {}
for value in dict.values():
    if value['currency'] not in new_dict:
        new_dict[value['currency']] = [value['maturity']]
    else:
        new_dict[value['currency']].append(value['maturity'])

另请注意:

  1. new_dict 中,您尝试将字典存储为值,但它看起来像一个列表(没有键或值)。所以在上面的代码中我使用了常用的列表。
  2. 我不知道这些是什么:currencymaturity 等。所以我改用字符串

【讨论】:

  • 谢谢 - 我能够处理这个问题并解决问题!对于处于类似绑定中的任何人,这就是我为创建嵌套字典所做的。完全归功于奥列格。
  • new_dict = {} for dict.values() 中的值:如果 value.get('CURRENCY') 不在 new_dict 中:new_dict[value.get('CURRENCY')] = {value.get ('MATURITY'):value.get('YIELD')} else: new_dict[value.get('CURRENCY')].update({value.get('MATURITY'):value.get('YIELD')} )
【解决方案2】:

可以将其写为复杂的嵌套字典理解,但我不推荐它。使用defaultdict 并遍历原始字典中的条目会更加简洁:

from collections import defaultdict
from typing import Any, Dict

my_dict: Dict[str, Dict[str, Any]] = {
    "garbage1": {"currency": 'JPY', "maturity": "20apr2021", "yield": -0.50},
    "garbage2": {"currency": 'JPY', "maturity": "30mar2022", "yield": -0.2},
    "garbage3": {"currency": 'EUR', "maturity": "15may2021", "yield": +0.1}
}

new_dict: Dict[str, Dict[str, float]] = defaultdict(dict)
for entry in my_dict.values():
    new_dict[entry["currency"]][entry["maturity"]] = entry["yield"]

【讨论】:

    猜你喜欢
    • 2016-11-14
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 2017-12-16
    • 2017-12-05
    • 2020-08-08
    • 2017-11-10
    • 1970-01-01
    相关资源
    最近更新 更多