Python 如何使用另一个词典列表筛选词典列表
我想用Python和Django中的另一个字典列表过滤字典列表 我有一个过滤器列表,如下所示: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
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:我会检查过滤器列表,排除这些,然后对价格进行额外过滤。