python字典列表删除具有空列表的项目

问题描述 投票:0回答:5

带有列表l,如下所示

l = [{'x': 2}, {'y': [], 'z': 'hello'}, {'a': []}]

需要弹出具有空列表作为值的元素。

预期输出

[{'x': 2}, {z: 'hello'}]

试图通过列表理解来实现这一点,需要帮助。

python list-comprehension
5个回答
2
投票

以下内容适用于您的数据:

>>> [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。


2
投票

您可以尝试这个。

list(filter(None,({k:v for k,v in d.items() if v!=[]} for d in l)))
#[{'x': 2}, {'z': 'hello'}]

0
投票

这是一种无需双重(甚至三重)列表理解的方法,因为一见钟情它们确实不容易阅读。 (复杂胜于复杂。

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'}]

0
投票

一种替代方法是: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'}]

0
投票

有点类似于现有的响应,但是使用单项列表理解,并带有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'}]
© www.soinside.com 2019 - 2024. All rights reserved.