【问题标题】:Replace item if is found in other dictionary in item or in key如果在 item 或 key 中的其他字典中找到,则替换 item
【发布时间】:2021-10-22 23:27:48
【问题描述】:

我需要一个内联函数,用这两个字典

mi_data = {'aggrLevel': 'region', 'capType': 'VTTLTEAM', 'date': '2021-03-29', 'Business': 'VTTL'}
map_to_A = {'VANTTL': 'VTTL', 'VTLONLY': 'VTL_NORMAL', 'VTTLTEAM': 'VTL_EXPO', 'VTTLCNSOLO': 'VTTL_CN', 'BTCHEM': 'BTCHEM'}

获取下一个结果

mi_data =  {'aggrLevel': 'region', 'capType': 'VTL_EXPO', 'date': '2021-03-29', 'Business': 'VTTL'}

我用常规函数成功地做到了

def replace_values( d, d2 ):
    for k, v in d.items():
        if isinstance(v, str) and v in d2:
            d[k] = d2[v]
    return d    
replace_values(mi_data, map_to_A)
mi_data

我尝试了这个内联函数,但没有成功

mi_data = {map_to_A.get(k, k):v for k, v in mi_data.items()}
mi_data

我无法在capType 中得到替换,我得到了相同的

mi_data = {'aggrLevel': 'region', 'capType': 'VTCTEAM', 'date': '2021-03-29', 'Business': 'VTTL'}

请注意,如果您在同一个文件中运行这两种方法,并且如果您先运行常规函数,它会更改 mi_data,也许您会认为内联函数正在完成这项工作。

【问题讨论】:

  • map_to_A 字典完全不同...
  • 我用常规函数成功实现了您发布的函数没有任何作用,if 条件始终为False。检查值是否为str 有什么意义?
  • map_to_A.get(k, k) 应该是map_to_A.get(v, k)
  • map_to_A 中没有 VTCTEAM 密钥,因此您在 mi_data 中得到相同的 k,v

标签: python dictionary replace dictionary-comprehension


【解决方案1】:

以下字典理解有效:

{k: (map_to_A[v] if v in map_to_A.keys() else v) for k,v in mi_data.items()}

输出:

{'aggrLevel': 'region', 'capType': 'VTL_EXPO', 'date': '2021-03-29', 'Business': 'VTTL'}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多