带有列表l
,如下所示
l = [{'x': 2}, {'y': [], 'z': 'hello'}, {'a': []}]
需要弹出具有空列表作为值的元素。
预期输出
[{'x': 2}, {z: 'hello'}]
试图通过列表理解来实现这一点,需要帮助。
以下内容适用于您的数据:
>>> [d for d in ({k: v for k, v in d_.items() if v} for d_ in l) if d]
[{'x': 2}, {'z': 'hello'}]
内部dict理解会从具有空列表值的dict中过滤掉那些键-值对,外部comprehension会过滤出空dicts。
您可以尝试这个。
list(filter(None,({k:v for k,v in d.items() if v!=[]} for d in l)))
#[{'x': 2}, {'z': 'hello'}]
这是一种无需双重(甚至三重)列表理解的方法,因为一见钟情它们确实不容易阅读。 (复杂胜于复杂。)
l = [{'x': 2}, {'y': [], 'z': 'hello'}, {'a': []}]
cleaned_list = list()
for dirty_dict in l:
cleaned_dict = dict()
for key, value in dirty_dict.items():
if value:
cleaned_dict[key] = value
if cleaned_dict:
cleaned_list.append(cleaned_dict)
cleaned_list
# [{'x': 2}, {'z': 'hello'}]
一种替代方法是:a)使用一个简单的循环删除空条目,并b)过滤最终列表:
l = [{'x': 2}, {'y': [], 'z': 'hello'}, {'a': []}]
for i,d in enumerate(l):
l[i]={k:v for k,v in d.items() if isinstance(v, list) and len(v)==0}
l=list(filter(None, l))
>>> l
[{'x': 2}, {'z': 'hello'}]
有点类似于现有的响应,但是使用单项列表理解,并带有if
来过滤出空白项。
def remove_empty(input_list):
return [dict((k, v) for k, v in d.items() if v != [])
for d in input_list
if not (len(d) == 1 and list(d.values()) == [[]])]
remove_empty(l)
输出:
[{'x': 2}, {'z': 'hello'}]