删除所有元素均为None的嵌套列表

时间:2018-03-28 16:05:01

标签: python python-3.x list dictionary

我有一系列列表(在字典中),我想删除任何只有None作为元素的列表。但是,列表有各种不同的格式,例如

x=[None,[None],[None]]
x=[None,None,None]
x=[None,[None,None],[None,None]]

其中任何None都可以替换为值。

任何示例都是以下字典:

dict={"x1": [None,None,None],"x2": [None,[None],[None]], "x3": [None,[1],[0.5]],
      "x4":[None,[None,None],[None,None]],"x5":[None,[180,-360],[90,-180]]}

在这种情况下,我想保留(key,value)"x3""x5",因为它们包含的值不是None,而是要删除{{1} }},"x1""x2"因此返回:

"x4"

对字典中各种列表(dict={"x3": [None,[1],[0.5]], "x5":[None,[180,-360],[90,-180]]} )的简单列表理解,例如

x

any(e is not None for e in x) 条目读为[None]并返回not None

如何确定哪些列表实际包含值而不是True元素。我已经看过删除方括号的选项,例如使用{[None]这样建议的itertools,但这些都依赖于列表中的所有元素以相同的方式格式化,而我有混合格式。我无法更改格式,因为软件中的其他格式需要格式化。

3 个答案:

答案 0 :(得分:3)

根据Benjamin的评论,如果list_input中的所有嵌套列表包含相同的值val_to_check,则此函数应返回True,否则返回False:

def check_val(list_input, val_to_check):
    for elem in list_input:
        if isinstance(elem, list):
            if check_val(elem, val_to_check) == False:
                return False
        else:
            if elem != val_to_check:
                return False
    return True

答案 1 :(得分:3)

您可以编写自定义递归函数来检查嵌套列表的所有元素是否都是None

def is_none(a):
    return all(x is None if not isinstance(x, list) else is_none(x) for x in a)

my_dict = {"x1": [None, None, None],
           "x2": [None, [None], [None]],
           "x3": [None, [1], [0.5]],
           "x4": [None, [None, None], [None, None]],
           "x5": [None, [180, -360], [90, -180]]}

new_dict = {k: v for k, v in my_dict.items() if not is_none(v)}
print(new_dict)
# {'x3': [None, [1], [0.5]], 'x5': [None, [180, -360], [90, -180]]}

答案 2 :(得分:1)

此解决方案在性质上与Keyur Potdar的解决方案类似,但它适用于所有类型的容器,而不仅仅是list

my_dict = {
    "x1": [None, None, None],
    "x2": [None, [None], [None]],
    "x3": [None, [1], [0.5]],
    "x4": [None, [None, None], [None, None]],
    "x5": [None, [180, -360], [90, -180]],
}

def all_None(val):
    # Check for None
    if val is None:
        return True
    # val is not None
    try:
        # val may be a container
        return all(all_None(el) for el in val)
    except:
        # val is neither None nor a container
        return False

my_dict_filtered = {key: val for key, val in my_dict.items() if not all_None(val)}
print(my_dict_filtered)