Python 如何使用另一个词典列表筛选词典列表

Python 如何使用另一个词典列表筛选词典列表,python,django,Python,Django,我想用Python和Django中的另一个字典列表过滤字典列表 我有一个过滤器列表,如下所示: filters = [{'type': 'make', 'value': 'SEAT'}, {'type': 'model', 'value': 'Acura'}] vehicles = [ {'make': 'Audi', 'model': 'A3', 'transmission': 'Manual'}, {'make': 'Audi', 'model': 'A1', 'transmiss

我想用Python和Django中的另一个字典列表过滤字典列表

我有一个过滤器列表,如下所示:

filters = [{'type': 'make', 'value': 'SEAT'}, {'type': 'model', 'value': 'Acura'}]
vehicles = [
  {'make': 'Audi', 'model': 'A3', 'transmission': 'Manual'},
  {'make': 'Audi', 'model': 'A1', 'transmission': 'Automatic'},
  {'make': 'Seat', 'model': 'Acura', 'transmission': 'Manual'},
  {'make': 'Seat', 'model': 'LEON', 'transmission': 'Manual'},
  {'make': 'Skoda', 'model': 'Octavia', 'transmission': 'Manual'},
]
def filter_item(vehicle, filters):
    for fil in filters:
        key = fil['type']
        value = fil['value']
        if key == 'make':
            if vehicle.make == value:
                continue
        elif key == 'model':
            if vehicle.model == value:
                continue
        else:
            return False

    return True

vehicles = list(filter(lambda vehicle: filter_item(vehicle, filters), vehicles))
filters = [
   {'type': 'make', 'value': 'SEAT'},
   {'type': 'model', 'value': 'Acura'},
   {'type': 'model', 'value': 'LEON'}
]
我有一份车辆清单如下:

filters = [{'type': 'make', 'value': 'SEAT'}, {'type': 'model', 'value': 'Acura'}]
vehicles = [
  {'make': 'Audi', 'model': 'A3', 'transmission': 'Manual'},
  {'make': 'Audi', 'model': 'A1', 'transmission': 'Automatic'},
  {'make': 'Seat', 'model': 'Acura', 'transmission': 'Manual'},
  {'make': 'Seat', 'model': 'LEON', 'transmission': 'Manual'},
  {'make': 'Skoda', 'model': 'Octavia', 'transmission': 'Manual'},
]
def filter_item(vehicle, filters):
    for fil in filters:
        key = fil['type']
        value = fil['value']
        if key == 'make':
            if vehicle.make == value:
                continue
        elif key == 'model':
            if vehicle.model == value:
                continue
        else:
            return False

    return True

vehicles = list(filter(lambda vehicle: filter_item(vehicle, filters), vehicles))
filters = [
   {'type': 'make', 'value': 'SEAT'},
   {'type': 'model', 'value': 'Acura'},
   {'type': 'model', 'value': 'LEON'}
]
我想得到所有的车辆制造座椅和模型阿库拉。因此,我想要的结果是:

[      
  {'make': 'Seat', 'model': 'Acura', 'transmission': 'Manual'}
]
我尝试了以下方法:

filters = [{'type': 'make', 'value': 'SEAT'}, {'type': 'model', 'value': 'Acura'}]
vehicles = [
  {'make': 'Audi', 'model': 'A3', 'transmission': 'Manual'},
  {'make': 'Audi', 'model': 'A1', 'transmission': 'Automatic'},
  {'make': 'Seat', 'model': 'Acura', 'transmission': 'Manual'},
  {'make': 'Seat', 'model': 'LEON', 'transmission': 'Manual'},
  {'make': 'Skoda', 'model': 'Octavia', 'transmission': 'Manual'},
]
def filter_item(vehicle, filters):
    for fil in filters:
        key = fil['type']
        value = fil['value']
        if key == 'make':
            if vehicle.make == value:
                continue
        elif key == 'model':
            if vehicle.model == value:
                continue
        else:
            return False

    return True

vehicles = list(filter(lambda vehicle: filter_item(vehicle, filters), vehicles))
filters = [
   {'type': 'make', 'value': 'SEAT'},
   {'type': 'model', 'value': 'Acura'},
   {'type': 'model', 'value': 'LEON'}
]
但这给了我所有的交通工具

有什么想法吗

更新

因此,如果我有如下过滤器:

filters = [{'type': 'make', 'value': 'SEAT'}, {'type': 'model', 'value': 'Acura'}]
vehicles = [
  {'make': 'Audi', 'model': 'A3', 'transmission': 'Manual'},
  {'make': 'Audi', 'model': 'A1', 'transmission': 'Automatic'},
  {'make': 'Seat', 'model': 'Acura', 'transmission': 'Manual'},
  {'make': 'Seat', 'model': 'LEON', 'transmission': 'Manual'},
  {'make': 'Skoda', 'model': 'Octavia', 'transmission': 'Manual'},
]
def filter_item(vehicle, filters):
    for fil in filters:
        key = fil['type']
        value = fil['value']
        if key == 'make':
            if vehicle.make == value:
                continue
        elif key == 'model':
            if vehicle.model == value:
                continue
        else:
            return False

    return True

vehicles = list(filter(lambda vehicle: filter_item(vehicle, filters), vehicles))
filters = [
   {'type': 'make', 'value': 'SEAT'},
   {'type': 'model', 'value': 'Acura'},
   {'type': 'model', 'value': 'LEON'}
]
我想要下一个结果:

[      
  {'make': 'Seat', 'model': 'Acura', 'transmission': 'Manual'},
  {'make': 'Seat', 'model': 'LEON', 'transmission': 'Manual'},
]
我该怎么做


我是否需要更改过滤器列表的结构,或者?

考虑到车辆,您的过滤不会返回False。make与value不相同,等等

您可以将筛选器重写为:

def filter_item(vehicle, filters):
    for fil in filters:
        key = fil['type']
        value = fil['value']
        if key == 'make':
            if vehicle.make != value:
                return False
        elif key == 'model':
            if vehicle.model != value:
                return False
        else:
            return False
    return True
或带有:


如果您的车辆不是具有属性的对象,而是字典,则应将getattrvehicle,k替换为vehicle[k]。

您的筛选不会返回False,因为vehicle.make与值不同,等等

您可以将筛选器重写为:

def filter_item(vehicle, filters):
    for fil in filters:
        key = fil['type']
        value = fil['value']
        if key == 'make':
            if vehicle.make != value:
                return False
        elif key == 'model':
            if vehicle.model != value:
                return False
        else:
            return False
    return True
或带有:

如果您的车辆不是具有属性的对象,而是字典,则应将getattrvehicle,k替换为vehicle[k]。

vehicles=[ {'make':'Audi','model':'A3','transmission':'Manual'}, {'make':'Audi','model':'A1','transmission':'Automatic'}, {'make':'Seat','model':'Acura','transmission':'Manual'}, {'make':'Seat','model':'LEON','transmission':'Manual'}, {'make':'Skoda','model':'Octavia','transmission':'Manual'}, ] 过滤器=[ {'type':'make','value':'Seat'}, {'type':'model','value':'Acura'}, {'type':'model','value':'LEON'} ] 筛选器=dict.fromkeysvehicles[0]。键,元组 对于过滤器中的过滤器: 过滤器\[filt['type']+=filt['value'], [车辆中的车辆对车辆] 如果所有车辆[钥匙]在val中或不在val(钥匙)中,则val在过滤器中[项目] 出[17]: [{'make':'Seat','model':'Acura','transmission':'Manual'}, {'make':'Seat','model':'LEON','transmission':'Manual'}] 车辆=[ {'make':'Audi','model':'A3','transmission':'Manual'}, {'make':'Audi','model':'A1','transmission':'Automatic'}, {'make':'Seat','model':'Acura','transmission':'Manual'}, {'make':'Seat','model':'LEON','transmission':'Manual'}, {'make':'Skoda','model':'Octavia','transmission':'Manual'}, ] 过滤器=[ {'type':'make','value':'Seat'}, {'type':'model','value':'Acura'}, {'type':'model','value':'LEON'} ] 筛选器=dict.fromkeysvehicles[0]。键,元组 对于过滤器中的过滤器: 过滤器\[filt['type']+=filt['value'], [车辆中的车辆对车辆] 如果所有车辆[钥匙]在val中或不在val(钥匙)中,则val在过滤器中[项目] 出[17]: [{'make':'Seat','model':'Acura','transmission':'Manual'}, {'make':'Seat','model':'LEON','transmission':'Manual'}]
如果过滤器中有两个模型呢?如下过滤器=[{'type':'make','value':'Seat'},{'type':'model','value':'Acura'},{'type':'model','value':'LEON'}]@Boky:那么这将不会提供任何值,因为make不能同时是Seat和Acura。如果你想过滤模型,我强烈建议你在数据库级别进行过滤。我将改变我的问题,因为这就是我想要的。超级。还有一个问题。如果我在过滤器中有min_price和max_price,并且我想比较车辆中的价格是否介于min_price和max_price之间,该怎么办?@Boky:我会检查过滤器列表,排除这些,然后对价格进行额外过滤。如果我在过滤器中有两个型号,该怎么办?如下过滤器=[{'type':'make','value':'Seat'},{'type':'model','value':'Acura'},{'type':'model','value':'LEON'}]@Boky:那么这将不会提供任何值,因为make不能同时是Seat和Acura。如果你想过滤模型,我强烈建议你在数据库级别进行过滤。我将改变我的问题,因为这就是我想要的。超级。还有一个问题。如果我在过滤器中有min_price和max_price,并且我想比较车辆中的价格是否介于min_price和max_price之间,该怎么办?@Boky:我会检查过滤器列表,排除这些,然后对价格进行额外过滤。