我有一系列列表(在字典中),我想删除任何只有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
,但这些都依赖于列表中的所有元素以相同的方式格式化,而我有混合格式。我无法更改格式,因为软件中的其他格式需要格式化。
答案 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)