什么是从列表中的dict中删除空值的有效方法?

Pal*_*era 1 python python-3.x

什么是从列表中保存的字典中删除空值的有效方法.

list1 = [{'l1k1': 'l1v1', 'l1k2': 'l1v2'}, {'l2k1': 'l2v1', 'l2k2': ''}]
list2 = []
for l in list1:
  d = {}
  for k, v in l.items():
    if v.strip() is not None or v.strip() != '':
      d[k] = v
  list2.append(d)
print(list2)
Run Code Online (Sandbox Code Playgroud)

实际产量:

[{'l1k1': 'l1v1', 'l1k2': 'l1v2'}, {'l2k1': 'l2v1', 'l2k2': ''}]
Run Code Online (Sandbox Code Playgroud)

预期产出:

[{'l1k1': 'l1v1', 'l1k2': 'l1v2'}, {'l2k1': 'l2v1'}]
Run Code Online (Sandbox Code Playgroud)

Ósc*_*pez 7

试试这个:

list1 = [{'l1k1': 'l1v1', 'l1k2': 'l1v2'}, {'l2k1': 'l2v1', 'l2k2': ''}]
list2 = [{ k: v for k, v in d.items() if v and v.strip() } for d in list1]
Run Code Online (Sandbox Code Playgroud)

请注意,正确的检查是v and v.strip()确保字符串不是None并且不是所有空格.它按预期工作:

list2
=> [{'l1k1': 'l1v1', 'l1k2': 'l1v2'}, {'l2k1': 'l2v1'}]
Run Code Online (Sandbox Code Playgroud)

它是有效的,因为它使用列表推导和字典理解,这比执行显式循环更快.而且,它非常紧凑和惯用:)


Ark*_*tev 7

试试这个 :

list2 = [{k:v for k,v in i.items() if v!= '' or v.strip() != ''} for i in list1]
Run Code Online (Sandbox Code Playgroud)

我们可以同时使用dict-comprehension和list-comprehension.我们循环每个元素(它是一个字典)list1,并且只取这些键值对,其中值或value.strip()字典中的相应键不是空字符串.

None类型取消值的较短版本:

list2 = [{k:v for k,v in i.items() if v} for i in list1]
Run Code Online (Sandbox Code Playgroud)