我很难递归地从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'}
如果您不希望更改发生在适当的位置,这是一种简单的方法。它只是粗暴地遍历数据结构,对其中包含的内容做出相当严格的假设:
同样,这会创建一个原始数据结构的副本,它不会发生变化。在适当的地方这样做会让人更加恼火。你知道吗
以上假设您的键总是字符串。此外,此功能可能有损,这是您的操作固有的。如果两个不同的键以某种方式映射到同一个新键,则由于字典的性质,只保留一个键。你知道吗
相关问题 更多 >
编程相关推荐