从dict中删除空格:Python

Nik*_*ain 2 python dictionary

考虑一下我有傻瓜.防爆.

 dict1 = {"1434": {"2012-10-29": {"275174": {"declaration_details":
 {"UTCC": `"38483 "`, "CNRE": "8334", "CASH": "55096.0"},
 "sales_details": {"UTCC": "38483.0", "CNRE": "8334.0", "CASH":
 "55098.0"}}, "275126": {"declaration_details": {"CNIS": "63371"},
 "sales_details": {"CNIS": "63371.0"}}, "275176":
 {"declaration_details": {"UTCC": "129909", "CASH": `"93200.0 "`,
 "CNRE": "28999", "PBGV": "1700"}, "sales_details": {"UTCC":
 "131619.0", "PBGV": "1700.0", "CASH": "92880.0", "CNRE": "28999.0"}},
 "275169": {"declaration_details": {"AMCC": "118616", "CNRE": "19462",
 "CASH": "120678.0"}, "sales_details": {"UTCC": "118616.0", "CNRE":
 "19462.0", "CASH": "120677.0"}}, "266741": {"declaration_details":
 {"UTCC": "42678", "CNRE": "4119", "CASH": `"24944.0 "`},
 "sales_details": {"UTCC": "42678.0", "CNRE": "4119.0", "CASH":
 "24944.0"}}}}}
Run Code Online (Sandbox Code Playgroud)

我想删除那个dict1中的所有空格.

哪种方法更好?

roo*_*oot 6

def removew(d):
  for k, v in d.iteritems():
    if isinstance(v, dict):
      removew(v)
    else:
      d[k]=v.strip()


removew(dict1)
print dict1
Run Code Online (Sandbox Code Playgroud)

输出:

{'1434': {'2012-10-29': {'275174': {'declaration_details': {'UTCC': '38483', 'CNRE': '8334', 'CASH': '55096.0'}, 'sales_details': {'UTCC': '38483.0', 'CNRE': '8334.0', 'CASH': '55098.0'}}, '275126': {'declaration_details': {'CNIS': '63371'}, 'sales_details': {'CNIS': '63371.0'}}, '275176': {'declaration_details': {'UTCC': '129909', 'CNRE': '28999', 'CASH': '93200.0', 'PBGV': '1700'}, 'sales_details': {'UTCC': '131619.0', 'CNRE': '28999.0', 'CASH': '92880.0', 'PBGV': '1700.0'}}, '275169': {'declaration_details': {'CNRE': '19462', 'AMCC': '118616', 'CASH': '120678.0'}, 'sales_details': {'UTCC': '118616.0', 'CNRE': '19462.0', 'CASH': '120677.0'}}, '266741': {'declaration_details': {'UTCC': '42678', 'CNRE': '4119', 'CASH': '24944.0'}, 'sales_details': {'UTCC': '42678.0', 'CNRE': '4119.0', 'CASH': '24944.0'}}}}}
Run Code Online (Sandbox Code Playgroud)

编辑:如Blckknght所述,第一个解决方案,如果您的strip()密钥包含空格(旧密钥,值对保留在字典中),将会中断.如果你需要剥离使用dict理解,返回一个新的dict(从python 2.7开始可用).

def removew(d):
    return   {k.strip():removew(v)
             if isinstance(v, dict)
             else v.strip()
             for k, v in d.iteritems()}
removew(dict1)
Run Code Online (Sandbox Code Playgroud)

  • 这大多是正确的(和我的答案几乎相同),但如果键中有空格,它就不会做正确的事情.旧密钥:值对将保留.此外,如果你在迭代时添加和删除键,它可能会破坏你的字典(你可能会跳过一些,或者看多次,或者恶魔可能会飞出你的鼻子). (2认同)

Blc*_*ght 6

我认为递归函数可能是您最好的方法.这样您就不必担心空格所在的嵌套字典的深度.

def strip_dict(d):
    return { key : strip_dict(value)
             if isinstance(value, dict)
             else value.strip()
             for key, value in d.items() }
Run Code Online (Sandbox Code Playgroud)

如果你想删除除值的键空白,只需更换keykey.strip()字典理解的第一排.