Python(2.x)从dict列表的键中删除字符

2024-04-26 05:36:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我很难递归地从python dict的键中移除不需要的字符,其中包含dict列表。我正在尝试通过使用递归解决方案从数据集中的所有键中删除“#”和“@”符号,该解决方案不需要我硬编码代码中的所有字段。你知道吗

{
    "id": "123456",
    "name": "some name",
    "contact_info": {
        "phone": { "@suppress": "false", "#number": "123456789" }
    },
    "categories": {
        "category ": [
            { "@primary ": "true", "@parentid ": "1234", "@nameid ": "5678", "@name ": "Category name 1" }, 
            { "@primary ": "false", "@parentid ": "5678", "@nameid ": "2532", "@name ": "Category name 2" } 
        ]
    }
}

下面是我迄今为止使用的代码,它可以处理dict,但是我在处理dict列表(item:category)时遇到了问题。你知道吗

import json

def remove_chars(obj):
        for key in obj.keys():
                if isinstance(obj[key], dict):
                        obj[key] = remove_chars(obj[key])
                new_key = key.replace("@","").replace("#","")
                if new_key != key:
                        obj[new_key] = obj[key]
                        del obj[key]
        return obj

a = json.loads('{ "id": "123456", "name": "some name", "contact_info": { "phone": { "@suppress": "false", "#number": "123456789" } }, "categories": { "category ": [ { "@primary ": "true", "@parentid ": "1234", "@nameid ": "5678", "@name ": "Category name 1" },  { "@primary ": "false", "@parentid ": "5678", "@nameid ": "2532", "@name ": "Category name 2" }  ] } }')

print a
print remove_chars(a)

以下是各自的输出: 第一个可以,因为它删除了第一个dict中的@和#符号。但是列表下的符号没有正确处理。你知道吗

{u'contact_info': {u'phone': {u'@suppress': u'false', u'#number': u'123456789'}}, u'id': u'123456', u'categories': {u'category ': [{u'@parentid ': u'1234', u'@name ': u'Category name 1', u'@nameid ': u'5678', u'@primary ': u'true'}, {u'@parentid ': u'5678', u'@name ': u'Category name 2', u'@nameid ': u'2532', u'@primary ': u'false'}]}, u'name': u'some name'}

{u'contact_info': {u'phone': {u'suppress': u'false', u'number': u'123456789'}}, u'id': u'123456', u'categories': {u'category ': [{u'@parentid ': u'1234', u'@name ': u'Category name 1', u'@nameid ': u'5678', u'@primary ': u'true'}, {u'@parentid ': u'5678', u'@name ': u'Category name 2', u'@nameid ': u'2532', u'@primary ': u'false'}]}, u'name': u'some name'}

Tags: keynameinfoidfalseobjcontactphone
1条回答
网友
1楼 · 发布于 2024-04-26 05:36:41

如果您不希望更改发生在适当的位置,这是一种简单的方法。它只是粗暴地遍历数据结构,对其中包含的内容做出相当严格的假设:

>>> def replace_keys(data, replacer):
...     if isinstance(data, dict):
...         return {replacer(k): replace_keys(v, replacer) for k, v in data.items()}
...     elif isinstance(data, list):
...         return [replace_keys(val, replacer) for val in data]
...     else:
...         return data
...
>>> def replacer(s):
...    return s.translate({35: '', 64: ''})
...
>>> from pprint import pprint
>>> pprint(data)
{'categories': {'category ': [{'@name ': 'Category name 1',
                               '@nameid ': '5678',
                               '@parentid ': '1234',
                               '@primary ': 'true'},
                              {'@name ': 'Category name 2',
                               '@nameid ': '2532',
                               '@parentid ': '5678',
                               '@primary ': 'false'}]},
 'contact_info': {'phone': {'#number': '123456789', '@suppress': 'false'}},
 'id': '123456',
 'name': 'some name'}
>>> pprint(replace_keys(data, replacer))
{'categories': {'category ': [{'name ': 'Category name 1',
                               'nameid ': '5678',
                               'parentid ': '1234',
                               'primary ': 'true'},
                              {'name ': 'Category name 2',
                               'nameid ': '2532',
                               'parentid ': '5678',
                               'primary ': 'false'}]},
 'contact_info': {'phone': {'number': '123456789', 'suppress': 'false'}},
 'id': '123456',
 'name': 'some name'}

同样,这会创建一个原始数据结构的副本,它不会发生变化。在适当的地方这样做会让人更加恼火。你知道吗

以上假设您的键总是字符串。此外,此功能可能有损,这是您的操作固有的。如果两个不同的键以某种方式映射到同一个新键,则由于字典的性质,只保留一个键。你知道吗

相关问题 更多 >