Альтернативой является: а) использовать простой 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'}]
Преимущество здесь (над пониманием) в том, что список отредактировано вместо скопированного.