关于python:检查列表中的dicts并删除无效的dict

check dicts in list and remove invalid dict

我要检查列表中的听写,其格式为:

  • 应该有键:classsubjectteacher
  • 钥匙的值不能为空

但我得到了奇怪的结果:如果1 {'subject':'history','teacher':'Marry'}无效但代码没有删除它!

第二种情况很好

我要做的是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# case 1
data_list = [{'class':'A','subject':'math','teacher':'Sam'},
             {'class':'','subject':'','teacher':''},
             {'subject':'history','teacher':'Marry'}]

# case 2
# data_list = [{'teacher': 'Marry', 'subject': 'D'}]


for data in data_list:
    message={}
    message['class'] = data.get('class',required_field) or blank_field
    message['subject'] = data.get('subject',required_field) or blank_field
    message['teacher'] = data.get('teacher',required_field) or blank_field

    if required_field in message.values() or blank_field in message.values():
        print"This dict need to be remove:{}".format(message)
        data_list.remove(data)

print"#### final list ####"  
print data_list    
print"#### final list ####"

案例1结果:

1
2
3
4
5
This dict need to be remove:{'teacher': 'This_field_may_not_be_blank', 'class': 'This_field_may_not_be_blank', 'subject': 'This_field_may_not_be_blank'}  
#### final list ####
[{'teacher': 'Sam', 'class': 'A', 'subject': 'math'},
 {'teacher': 'Marry', 'subject': 'history'}]
#### final list ####

案例2结果:

1
2
3
4
This dict need to be remove:{'teacher': 'Marry', 'class': 'This_field_is_required', 'subject': 'D'}
#### final list ####
[]
#### final list ####


AJK已经指出了代码的问题所在,但是您也可以缩短代码的长度,从而更容易理解代码。记住,如果给定的键不在dict中,字典get方法将返回None,并且None和空字符串""的值都为假。

因此,最简单的方法是创建一个可接受条目的新列表,如下所示:

1
2
3
4
result = []
for d in data_list:
    if d.get("class") and d.get("subject") and d.get("teacher"):
        result.append(d)

你可以通过理解来缩短这个时间:

1
2
result = [d for d in data_list
          if d.get("class") and d.get("subject") and d.get("teacher")]


这是因为您不应该从使用for迭代的列表中删除项目。

这里有一个类似的模块:在for循环(python)中删除列表项时出现问题

使用copy模块。埃多克斯1〔2〕