python список диктов удалить элементы с пустыми списками - PullRequest
1 голос
/ 05 марта 2020

со списком l, как показано ниже

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

необходимо извлечь элементы с пустым списком в качестве значения.

ожидаемый результат

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

Пытался добиться этого с помощью понимания списка, нужна помощь.

Ответы [ 6 ]

4 голосов
/ 05 марта 2020

Вы можете попробовать это.

list(filter(None,({k:v for k,v in d.items() if v!=[]} for d in l)))
#[{'x': 2}, {'z': 'hello'}]
4 голосов
/ 05 марта 2020

Следующие данные будут работать с вашими данными:

>>> [d for d in ({k: v for k, v in d_.items() if v} for d_ in l) if d]
[{'x': 2}, {'z': 'hello'}]

Внутреннее понимание различий отфильтровывает эти пары ключ-значение из кодов с пустыми значениями списка, внешнее понимание отфильтровывает пустые слова.

1 голос
/ 05 марта 2020

Альтернативой является: а) использовать простой l oop для удаления пустых записей и б) отфильтровать окончательный список:

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

for i,d in enumerate(l):
    l[i]={k:v for k,v in d.items() if v!=[]}
l=list(filter(None, l))  

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

Преимущество здесь (над пониманием) в том, что список отредактировано вместо скопированного.

0 голосов
/ 05 марта 2020

Вы можете попробовать это:

l = [{'x': 2}, {'y': [], 'z': 'hello'}, {'a': [],'b':'','c':0}]
print([ { k:v for k,v in ll.items() if v != [] } for ll in l ]);
0 голосов
/ 05 марта 2020

В некоторой степени похож на существующие ответы, но использует одноэтапное понимание списка, с 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)

output:

[{'x': 2}, {'z': 'hello'}]
0 голосов
/ 05 марта 2020

Вот способ сделать это без двойного (или даже тройного) понимания списков, потому что их на самом деле нелегко читать с первого взгляда. ( Комплекс лучше, чем сложный. )

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