如何从有条件的字典列表中提取字典



如何使用条件从 json 中提取

我有一个字典列表。我需要提取一些带有一些条件的字典

  • 如果对于跨字段,我需要"AND"条件

  • 对于相同的字段数组,我需要或条件

  1. 我需要搜索subject哪个是PhysicsAccounting这是字段数组(OR)语句

  2. 我需要搜索typePermanentGUEST条件这是字段数组(OR)语句

  3. 我需要搜索LocationNY(&)条件

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)

最新更新