从字典中删除空格:Python

3

考虑我有一个字典。

 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中所有空格。哪种方法更好?
5个回答

7
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

7

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

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()会失败。一个临时解决方案是在字典推导式的第三行中用str(value)替换value - Ronnie
@Ronnie:谈论从整数值中删除空格毫无意义,因此我假设字典看起来像问题中的那个,包含字符串(即使是数字值)。Python不会在123"123"之间进行转换,因此您不应该混淆它们。如果您的数据结构中有一个期望另一个,则肯定存在错误。 - Blckknght
说得好。不过我碰巧有一个JSON对象,它被解析为一个dict,并且在另一个字典子元素中有一个整数值的键。 - Ronnie

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

1
我需要一个函数来清除包含其他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() }

你的代码没问题,但在整数/浮点数值上会出错...这里有一个可能的解决方法:如果 isinstance(value(bool, float, int)),否则 clean(value)。 - nicolasassi

0

由于上面的回答有一些错误并且没有考虑到一些可能性,所以我发布了我的版本的答案,可以递归地剥离键和值。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接