我应该如何从一个列表中删除所有没有值的dict?

2024-04-28 08:57:56 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有这样一个列表:

[{'name': 'Blah1', 'age': x}, {'name': 'Blah2', 'age': y}, {'name': None, 'age': None}]

可以保证“name”和“age”值都将被填充或为空

我试过这个:

for person_dict in list:
    if person_dict['name'] == None:
        list.remove(person_dict)

但很明显,这是行不通的,因为for循环有时会跳过索引并忽略一些空白的人

我对Python还比较陌生,我想知道是否有一个list方法可以针对具有与键相关联的特定值的dict

编辑:固定元组符号列为注释指出


Tags: nameinnone列表forageifdict
3条回答

只需测试dict值中是否存在None,即可测试所有dict键的None值:

>>> ToD=({'name': 'Blah1', 'age': 'x'}, {'name': 'Blah2', 'age': 'y'}, {'name': None, 'age': None})
>>> [e for e in ToD if None not in e.values()]
[{'age': 'x', 'name': 'Blah1'}, {'age': 'y', 'name': 'Blah2'}]

或者,使用过滤器:

>>> filter(lambda d: None not in d.values(), ToD)
({'age': 'x', 'name': 'Blah1'}, {'age': 'y', 'name': 'Blah2'})

或者,如果是对“name”的限制测试:

>>> filter(lambda d: d['name'], ToD)
({'age': 'x', 'name': 'Blah1'}, {'age': 'y', 'name': 'Blah2'})

您可以使用列表理解作为这样的过滤器

[c_dict for c_dict in dict_lst if all(c_dict[key] is not None for key in c_dict)]

这将确保只获取所有值都不是None的字典

for index,person_dict in enumerate(lis):
    if person_dict['name'] == None:
        del lis[index]

你也可以试试

lis=[person_dict  for person_dict in lis if person_dict['name'] != None]  

切勿将List用作变量

相关问题 更多 >