【问题标题】:replacing deleting empty values from dict, list recursively in python替换从dict中删除空值,在python中递归列出
【发布时间】:2020-10-18 07:06:49
【问题描述】:

我为删除每个 Null 或空内容的任务编写了以下代码。该脚本有效,但我认为它根本不是“pytonish”。蟒蛇的方式是如何做到的?

def remove_empty_values(ret):
    #ret is assumed eitehr dict or list
    #recursively remove all key or list items which values is Null or empty string
    if type(ret) == list:
            empty_indexes=[]
            i = 0
            for index in ret:
                    if (ret[i] == None) or ((type(ret[i]) == str and  ret[i] == '') or ((type(ret[i]) == unicode and  ret[i] == '') or (( type(ret[i])==dict or type(ret[i])==list )  and len(ret[i]) ==0))):
                            empty_indexes.append(i)
                    else:
                             if (type(ret[i])==dict or type(ret[i])==list):
                                    remove_empty_values(ret[i])
                    i = i + 1
            for index in empty_indexes:
                    del ret[index]

    elif type(ret) == dict:

            empty_keys=[]
            for key in ret:
                    if (ret[key] == None) or ((type(ret[key]) == str and ret[key] == '') or ((type(ret[key]) == unicode and ret[key] == '') or (( type(ret[key])==dict or type(ret[key])==list )  and len(ret[key]) ==0))):
                            empty_keys.append(key)
                    else:
                             if (type(ret[key])==dict or  type(ret[key])==list):
                                    remove_empty_values(ret[key])
            for key in empty_keys:
                    del ret[key]

【问题讨论】:

  • 你认为它不是“pythonish”吗?
  • 检查filter()
  • @ScottHunter 好吧,它完成的任务太长了,for 循环,I = I +1,我用 C++ 开发,我觉得这是一个 C 风格的代码 :)

标签: python list dictionary recursion


【解决方案1】:

如果你使用 Python 3.8+,你可以使用赋值表达式:=:

例如:

d = {'a': [{'b': 'x', 'c': ''}], 'c': ['', '1', None], 'd': ['']}


def remove(i):
    if isinstance(i, dict):
        return {k: vv for k, v in i.items() if (vv:=remove(v))}
    elif isinstance(i, list):
        return [vv for v in i if (vv:=remove(v))]
    return i

print(remove(d))

打印:

{'a': [{'b': 'x'}], 'c': ['1']}

编辑:保持零和False

d = {'a': [{'b': 'x', 'c': ''}], 'c': ['', '1', None], 'd': ['', 0, False]}


def remove(i):
    if isinstance(i, dict):
        return {k: vv for k, v in i.items() if (vv:=remove(v)) or v is False or v == 0}
    elif isinstance(i, list):
        return [vv for v in i if (vv:=remove(v)) or v is False or v == 0]
    return i

print(remove(d))

打印:

{'a': [{'b': 'x'}], 'c': ['1'], 'd': [0, False]}

【讨论】:

  • 但这会杀死布尔假值,不是吗?
  • 我还需要保留 0 和明确的布尔 false 值
猜你喜欢
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-14
  • 2019-07-01
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多