Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python(2.x)-从dict列表中的键中删除字符_Python - Fatal编程技术网

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

Python(2.x)-从dict列表中的键中删除字符,python,Python,我很难递归地从python dict的键中删除不需要的字符,其中包含dict列表。我正在尝试使用递归解决方案从数据集中的所有键中删除“#”和“@”符号,该解决方案不需要我硬编码代码中的所有字段 { "id": "123456", "name": "some name", "contact_info": { "phone": { "@suppress": "false", "#number": "123456789" } }, "catego

我很难递归地从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列表(项:category)时遇到了问题

以下是各自的产出: 第一个可以,因为它从第一个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'}

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

>>> 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'}
同样,这会创建原始数据结构的副本,而该副本不会发生变化。在适当的地方这样做会让人非常恼火


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

到目前为止,您尝试了什么,哪里遇到了问题?如果您正在寻求调试帮助,请提供一个解决方案。您向我展示您的解决方案,我将向您展示我的解决方案。请共享codez。。。。到目前为止,我添加了代码和输出。我在2.7.5下的translate函数中遇到了问题。我一直收到打字错误<代码>类型错误:应为字符缓冲区对象尝试
返回s.replace(无、@#')
也不起作用。@PrashantChaudhary然后您可以简单地使用
返回s.replace('#','').replace('@','')
。注意,
replacer
可以是任何你想要的,它接受一个字符串并返回一个替换项。谢谢@juanpa.arrivillaga。。。这个解决方案有效。虽然为每个处理过的记录创建一个副本似乎代价高昂,但它对我来说是可行的,因为我一次处理5k记录,系统可以处理它。@PrashantChaudhary只要内存不是问题,这可能比就地修改要快,因为它会带来各种复杂情况(必须删除键,在字典上迭代时不应该这样做)
>>> 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'}