2012-10-31 117 views
2

考慮我有字典。例如,從字典中刪除空格:Python

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"}}}}} 

我想刪除該dict1中的所有空格。

哪種方法更好?

回答

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 

輸出:

{'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'}}}}} 

編輯: 正如Blckknght,第一個解決方案指出,將打破,如果含有空格,你strip()密鑰(舊密鑰,值對留在字典)。如果你需要刪除使用詞典理解,返回一個新的字典(自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) 
+2

這是基本上是正確的(並且幾乎一樣我的答案),但它不會做正確的事情,如果有在一個鍵的空白。舊的鍵值對將保留。此外,如果您在迭代時添加和刪除鍵(可能會跳過一些鍵,或多次查看,或惡魔可能飛出您的鼻子),它可能會破壞您的詞典。 – Blckknght

+0

@ Blckknght - 謝謝你的提示,編輯。 – root

6

我認爲遞歸函數可能是你最好的方法。這樣你就不用擔心你的空白位於什麼深度的嵌套字典了。

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

如果你想從除值的鍵刪除空白,只是字典解析的第一行與key.strip()取代key

+0

謝謝Backknght :) –

2

這裏有一個函數,它不僅可以從值中刪除空格,而且還可以刪除鍵。

它遞歸當它找到一個字典,就像其他的答案:

def strip_dict(d): 
    """ 
    Recursively remove whitespace from keys and values in dictionary 'd' 
    """ 

    for key, value in d.iteritems(): 
     if ' ' in key: 
      d[key.strip()] = value 
      del d[key] 
     if isinstance(value, dict): 
      strip_dict(value) 
     elif isinstance(value, list): 
      d[key.strip()] = [x.strip() for x in value] 
     elif isinstance(value, str): 
      d[key.strip()] = value.strip()