如何使用条件从 json 中提取
我有一个字典列表。我需要提取一些带有一些条件的字典
-
如果对于跨字段,我需要"AND"条件
-
对于相同的字段数组,我需要或条件
-
我需要搜索
subject
哪个是Physics
或Accounting
这是字段数组(OR)语句和
-
我需要搜索
type
是Permanent
或GUEST
条件这是字段数组(OR)语句和
-
我需要搜索
Location
NY
(&)条件
test = [{'id':1,'name': 'A','subject': ['Maths','Accounting'],'type':'Contract', 'Location':'NY'},
{ 'id':2,'name': 'AB','subject': ['Physics','Engineering'],'type':'Permanent','Location':'NY'},
{'id':3,'name': 'ABC','subject': ['Maths','Engineering'],'type':'Permanent','Location':'NY'},
{'id':4,'name':'ABCD','subject': ['Physics','Engineering'],'type':['Contract','Guest'],'Location':'NY'}]
预期输出是 id[{ 'id':2,'name': 'AB','subject': ['Physics','Engineering'],'type':'Permanent','Location':'NY'},{'id':4,'name':'ABCD','subject': ['Physics','Engineering'],'type':['Contract','Guest'],'Location':'NY'}]
这里的问题主要是你的数据不统一,有时是字符串,有时是列表。让我们试试:
# turns the values into set for easy comparison
def get_set(d,field):
return {d[field]} if isinstance(d[field], str) else set(d[field])
# we use this to filter
def validate(d):
# the three lines below corresponds to the three conditions listed
return get_set(d,'subject').intersection({'Physics','Accounting'}) and
get_set(d,'type').intersection({'Permanent', 'Guest'}) and
get_set(d,'Location')=={'NY'}
result = [d for d in test if validate(d)]
输出:
[{'id': 2,
'name': 'AB',
'subject': ['Physics', 'Engineering'],
'type': 'Permanent',
'Location': 'NY'},
{'id': 4,
'name': 'ABCD',
'subject': ['Physics', 'Engineering'],
'type': ['Contract', 'Guest'],
'Location': 'NY'}]
以下带有嵌套 if 子句的简单方法解决了这个问题。and
条件是通过嵌套if
完成的,or
条件只是通过or
完成的。
in
运算符适用于字符串值和列表值,因此它可以互换使用并导致预期的输出。但是这种方法期望没有像XYZ Accounting
这样的特定主题。
result = []
for elem in test:
# Check Location
if elem['Location'] == 'NY':
# Check subject
subject = elem['subject']
if ('Accounting' in subject) or ('Physics' in subject):
# Check type
elem_type = elem['type']
if ('Permanent' in elem_type) or ('Guest' in elem_type):
# Add element to result, because all conditions are true
result.append(elem)