从列表中删除保存在字典中的空值的有效方法是什么。
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'}]
答案 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中" "
甚至不是" "
值,您实际上不应该这样认为也。要删除某些字符(问题中的空字符除外),您应该尝试创建并使用其他特定功能来代替。