我应该如何删除列表中包含None作为其值之一的所有dicts?

时间:2014-07-06 03:27:05

标签: python list dictionary

假设我有一个这样的列表:

[{'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比较陌生,我想知道是否有一个列表方法可以定位具有与键相关联的特定值的dicts。

编辑:修复了元组符号列表为注释指出

4 个答案:

答案 0 :(得分:1)

您可以将列表理解用作此类

的过滤器
[c_dict for c_dict in dict_lst if all(c_dict[key] is not None for key in c_dict)]

这将确保您只获得所有值都不是None的词典。

答案 1 :(得分:1)

只测试dict值中None的存在,以测试None值的所有dict键:

>>> 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'})

答案 2 :(得分:0)

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用作变量

答案 3 :(得分:0)

您可以使用已接受的数据创建新列表。如果你有元组,那么你必须创建新的列表。

列表理解可能会更快,但这个版本对于初学者来说更具可读性。

data = ({'name': 'Blah1', 'age': 'x'}, {'name': 'Blah2', 'age': 'y'}, {'name': None, 'age': None})

new_data = []

for x in data:
    if x['name']: # if x['name'] is not None and x['name'] != ''
        new_data.append(x)

print new_data