猿问

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

如何从带有条件的json中提取

我有一个字典列表。我需要在某些条件下提取一些字典

  • 如果对于跨字段我需要“AND”条件

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

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

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

  3. 我需要搜索Locationis 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'}]


叮当猫咪
浏览 116回答 2
2回答

神不在的星期二

这里的问题主要是你的数据不统一,有时是字符串,有时是列表。咱们试试吧:# turns the values into set for easy comparisondef get_set(d,field):    return {d[field]} if isinstance(d[field], str) else set(d[field])    # we use this to filterdef 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)
随时随地看视频慕课网APP
我要回答