【问题标题】:How to delete a sign from a key in a nested python dictionary with lists in it?如何从包含列表的嵌套python字典中的键中删除符号?
【发布时间】:2017-12-22 10:15:11
【问题描述】:

我有一个包含以下结构的 n 个 JSON 对象的数据转储:

{
    "_id" : {"$numberLong" : "734702956751294464" }, 
    "created_at" : "Mon May 23 11:10:09 +0000 2016", 
    "entities" : {
        "user_mentions" : [ { 
            "name" : "Thierry Zoller", 
            "id" : 15589731, 
            "indices" : [ 3, 17 ], 
            "screen_name" : "thierryzoller", 
            "id_str" : "15589731" 
            } ], 
        "media" : [ { 
            "source_status_id" : { "$numberLong" : "734677772963041280" }, 
            "url" : "XXXXX", 
            "source_user_id_str" : "15589731", 
            "source_user_id" : 15589731, 
            "id" : { "$numberLong" : "734677772703019008" }, 
            "type" : "photo", 
            "id_str" : "734677772703019008" 
            } ], 
        "hashtags" : [] }, 
    "favorited" : false, 
    "in_reply_to_user_id_str" : null, 
    "extended_entities" : { 
        "media" : [ { 
            "source_status_id" : { "$numberLong" : "734677772963041280" }, 
            "media_url_https" : "XXXXX", 
            "url" : "XXXXX", 
            "source_user_id_str" : "15589731", 
            "source_user_id" : 15589731,
            "indices" : [ 113, 136 ], 
            "display_url" : "pic.twitter.com/nO9tw2O4eY", 
            "id" : { "$numberLong" : "734677772703019008" }, 
            }]
        }
}

我想删除“$numberLong”键中的“$”。

以下代码消除了列表外键的“$”:

def rec_key_replace(obj):
    if isinstance(obj, Mapping):
        return {key.replace('$', ''): rec_key_replace(val) for key, val in obj.items()}
    return obj

如何扩展此功能,以便可以从键中删除所有“$”,即使它们位于嵌套列表中(可能列表还包含其他列表等)?

谢谢。

【问题讨论】:

  • 你让它递归,但你只处理 Mapping 类型的情况。您需要遍历该树中的其他对象和列表。

标签: python json dictionary nested key


【解决方案1】:

您可以使用递归函数遍历数据结构并替换以'$' 开头的字典键。

  1. 如果当前对象是一个列表,则循环遍历它包含的项目。

  2. 如果对象是字典,则更新以'$' 符号开头的键,方法是在弹出上设置一个带有'$' 字符已剥离的新键em> 旧键的值,然后通过字典值递归以发现嵌套的字典或列表。字符串值直接按原样返回。


from pprint import pprint

def replace_keys(obj):
    if isinstance(obj, list):
        return [replace_keys(x) for x in obj]
    elif isinstance(obj, dict):
        return {k.lstrip('$') if k.startswith('$') else k: replace_keys(x) 
                                                       for k, v in obj.items()}
    else:
        return obj

new_obj = replace_keys(obj)
pprint(new_obj) 

{'_id': {'numberLong': '734702956751294464'},
 'created_at': 'Mon May 23 11:10:09 +0000 2016',
 'entities': {'hashtags': [],
              'media': [{'id': {'numberLong': '734677772703019008'},
                         'id_str': '734677772703019008',
                         'source_status_id': {'numberLong': '734677772963041280'},
                         'source_user_id': 15589731,
                         'source_user_id_str': '15589731',
                         'type': 'photo',
                         'url': 'XXXXX'}],
              'user_mentions': [{'id': 15589731,
                                 'id_str': '15589731',
                                 'indices': [3, 17],
                                 'name': 'Thierry Zoller',
                                 'screen_name': 'thierryzoller'}]},
 'extended_entities': {'media': [{'display_url': 'pic.twitter.com/nO9tw2O4eY',
                                  'id': {'numberLong': '734677772703019008'},
                                  'indices': [113, 136],
                                  'media_url_https': 'XXXXX',
                                  'source_status_id': {'numberLong': '734677772963041280'},
                                  'source_user_id': 15589731,
                                  'source_user_id_str': '15589731',
                                  'url': 'XXXXX'}]},
 'favorited': 'false',
 'in_reply_to_user_id_str': 'null'}

【讨论】:

    【解决方案2】:
    import json
    import re
    
    j = {'_id': {'$numberLong': '734702956751294464'}, 'in_reply_to_user_id_str': None, 'created_at': 'Mon May 23 11:10:09 +0000 2016', 'extended_entities': {'media': [{'id': {'$numberLong': '734677772703019008'}, 'url': 'XXXXX', 'source_status_id': {'$numberLong': '734677772963041280'}, 'media_url_https': 'XXXXX', 'display_url': 'pic.twitter.com/nO9tw2O4eY', 'source_user_id': 15589731, 'indices': [113, 136], 'source_user_id_str': '15589731'}]}, 'favorited': False, 'entities': {'hashtags': [], 'media': [{'id': {'$numberLong': '734677772703019008'}, 'url': 'XXXXX', 'source_status_id': {'$numberLong': '734677772963041280'}, 'type': 'photo', 'source_user_id': 15589731, 'id_str': '734677772703019008', 'source_user_id_str': '15589731'}], 'user_mentions': [{'id': 15589731, 'screen_name': 'thierryzoller', 'name': 'Thierry Zoller', 'indices': [3, 17], 'id_str': '15589731'}]}}
    
    jStr = json.dumps(j)
    
    
    for x in re.findall("""{["']\$[^"']*["':]""", jStr):
        jStr = jStr.replace(x, re.sub('\$', '', x))
    
    print(jStr)
    

    【讨论】:

      猜你喜欢
      • 2021-09-22
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多