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

时间:2019-02-25 13:09:19

标签: 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)

实际输出:

[{'l1k1': 'l1v1', 'l1k2': 'l1v2'}, {'l2k1': 'l2v1', 'l2k2': ''}]

预期输出:

[{'l1k1': 'l1v1', 'l1k2': 'l1v2'}, {'l2k1': 'l2v1'}]

5 个答案:

答案 0 :(得分:6)

尝试一下:

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]

请注意,此处要进行的 correct 检查是v and v.strip(),以确保该字符串不是None并且不是所有空格。它按预期工作:

list2
=> [{'l1k1': 'l1v1', 'l1k2': 'l1v2'}, {'l2k1': 'l2v1'}]

之所以高效,是因为它使用列表推导和字典推导,比执行显式循环要快。而且,它非常紧凑和习惯:)

答案 1 :(得分:6)

尝试一下:

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

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

一种用于取消None类型值的简短版本:

list2 = [{k:v for k,v in i.items() if v} for i in list1]

答案 2 :(得分:0)

这是一个简单的替代方法,它不使用列表理解,这可能会使您更容易理解:

for d in list1:
  for k in d.keys():
      if d[k] != '':
          list2.append({k:d[k]})

答案 3 :(得分:0)

复制列表的效率不是很高,除非您也想保留原始列表。您可以像这样删除“空”条目:

list1 = [{'l1k1': 'l1v1', 'l1k2': 'l1v2'}, {'l2k1': 'l2v1', 'l2k2': ''}]
for item in list1:
    for key in list(item.keys()):
        if not item[key].strip():
            del item[key]

这部分list(item.keys())很重要。为什么列出?因为在迭代过程中更改dict的大小时python不喜欢它,所以如果我们预先获取了密钥,我们将在列表上进行迭代,而不是在生成器上进行迭代。

not item[key].strip()也是一个很好的提示,空字符串的值为False,而非空字符串的值为True

*注意:严格来说.keys()并不是必需的,但是如果您是python的新手,它确实有助于提高可读性

答案 4 :(得分:0)

setAge

最有效的方法是这样:

list1 = [{'l1k1': 'l1v1', 'l1k2': 'l1v2'}, {'l2k1': 'l2v1', 'l2k2': ''}]

PS:

使用list2 = [{k: v for k,v in dic.items() if v} for dic in list1] 仅适用于字符串,并且由于您拥有所有类型的.strip() / False / None值,这些值将不会被删除,实际上您会发现错误。另外:仅使用""删除.strip()(带空格)是错误的,因为在Python中" "甚至不是" "值,您实际上不应该这样认为也。要删除某些字符(问题中的空字符除外),您应该尝试创建并使用其他特定功能来代替。