【问题标题】:Remove white spaces from dict : Python从 dict 中删除空格:Python
【发布时间】:2012-10-20 14:16:31
【问题描述】:

考虑到我有 dict。 例如。

 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 中的所有空格。

哪种方法更好?

【问题讨论】:

    标签: python dictionary


    【解决方案1】:
    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】:

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

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

    如果您想从键中删除除值之外的空格,只需将字典理解第一行中的key 替换为key.strip()

    【讨论】:

    • 如果您的valueint 类型,在这种情况下value.strip() 将失败。管道胶带解决方案是将字典理解第三行中的value 替换为str(value)
    • @Ronnie:谈论从整数值中删除空格没有任何意义,所以我假设字典看起来像问题中的那个,带有字符串(即使是数值)。 Python 不会在123"123" 之间进行转换,因此您永远不应该将它们混为一谈。如果您的数据结构中有一个而您期望另一个,那么您肯定有一个错误。
    • 公平点。不过,我确实有一个 JSON 对象,它被解析为dict,并且在另一个字典子元素中具有一个整数值作为键。
    【解决方案3】:

    这里有一个函数,它不仅可以从值中去除空格,还可以从键中去除空格。

    它在找到字典时会递归,就像其他答案一样:

    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()
    

    【讨论】:

      【解决方案4】:

      我需要一个函数来清除嵌套字典中的所有空格,该字典包含其他 dictslists 或其他任何内容。这应该会有所帮助,我使用了上述答案。

      def strip_dict(d):
          def strip_list(l):
              return [strip_dict(x)
              if isinstance(x, dict)
              else strip_list(x)
              if isinstance(x, list)
              else clean(value) 
              for x in l]
      
          def clean(string):
              return ''.join(string.split())
      
          return { key.strip() : strip_dict(value)
                   if isinstance(value, dict)
                   else strip_list(value)
                   if isinstance(value, list)
                   else value
                   if isinstance(value, bool)
                   else clean(value)
                   for key, value in d.items() }
      

      【讨论】:

      • 您的代码很好,但会中断 int/float 值...这里有一个可能的解决方法:if isinstance(value(bool, float, int)) else clean(value)
      【解决方案5】:

      由于上述答案是正确的,但有一些错误并且没有考虑一些可能性,所以我发布了我的答案版本,它递归地去除了键和值。

      def strip_dict_keys_values(d):
          def strip_list(l):
              return [strip_dict_keys_values(x)
                      if isinstance(x, dict) else strip_list(x)
                      if isinstance(x, list) else clean(x) for x in l]
      
          def clean(value):
              if isinstance(value, str):
                  return value.strip()
              return value
      
          return {key.strip(): strip_dict_keys_values(value)
                  if isinstance(value, dict) else strip_list(value)
                  if isinstance(value, list) else clean(value)
                  if value is None else clean(value)
                  for key, value in d.items()}
      

      【讨论】:

        猜你喜欢
        • 2022-01-20
        • 1970-01-01
        • 2012-01-16
        • 1970-01-01
        • 2017-11-03
        • 1970-01-01
        • 2020-10-18
        • 1970-01-01
        • 2016-08-25
        相关资源
        最近更新 更多