3 回答
TA贡献1909条经验 获得超7个赞
您可以创建一个查找字典来搜索相应的匹配项O(1):
list1 = [{'vehicle': 1, 'mileage': 25, 'speed': 80},
{'vehicle': 2, 'mileage': 35, 'speed': 70},
{'vehicle': 3, 'mileage': 40, 'speed': 90},
{'vehicle': 5, 'mileage': 40, 'speed': 90}]
list2 = [{'vehicle': 1, 'mileage': 35, 'speed': 80},
{'vehicle': 2, 'mileage': 35, 'speed': 70},
{'vehicle': 3, 'mileage': 40, 'speed': 80},
{'vehicle': 4, 'mileage': 40, 'speed': 80}]
lookup = {e['vehicle'] : e for e in list1 }
result = []
for e in list2 :
if e['vehicle'] in lookup:
d = lookup[e['vehicle']]
if e['mileage'] >= d['mileage'] and e['speed'] >= d['speed']:
result.append(d)
print(result)
输出
[{'vehicle': 1, 'mileage': 25, 'speed': 80}, {'vehicle': 2, 'mileage': 35, 'speed': 70}]
使用列表推导的替代方法:
def better(e, d, keys=('mileage', 'speed')):
return all(e[k] >= d[k] for k in keys)
result = [lookup[e['vehicle']] for e in list2 if e['vehicle'] in lookup and better(e, lookup[e['vehicle']])]
print(result)
两种方法的总体复杂度为O(n).
TA贡献1880条经验 获得超4个赞
您可以将您的字典列表转换为嵌套字典,其中vehicle的关键是:
list1 = [
{"vehicle": 1, "mileage": 25, "speed": 80},
{"vehicle": 2, "mileage": 35, "speed": 70},
{"vehicle": 3, "mileage": 40, "speed": 90},
{"vehicle": 5, "mileage": 40, "speed": 90},
]
list2 = [
{"vehicle": 1, "mileage": 35, "speed": 80},
{"vehicle": 2, "mileage": 35, "speed": 70},
{"vehicle": 3, "mileage": 40, "speed": 80},
{"vehicle": 4, "mileage": 40, "speed": 80},
]
dict1 = {x["vehicle"]: x for x in list1}
# {1: {'vehicle': 1, 'mileage': 25, 'speed': 80}, 2: {'vehicle': 2, 'mileage': 35, 'speed': 70}, 3: {'vehicle': 3, 'mileage': 40, 'speed': 90}, 5: {'vehicle': 5, 'mileage': 40, 'speed': 90}}
dict2 = {x["vehicle"]: x for x in list2}
# {1: {'vehicle': 1, 'mileage': 35, 'speed': 80}, 2: {'vehicle': 2, 'mileage': 35, 'speed': 70}, 3: {'vehicle': 3, 'mileage': 40, 'speed': 80}, 4: {'vehicle': 4, 'mileage': 40, 'speed': 80}}
然后取键的交集并使用列表推导将结果作为字典列表返回:
result = [
dict1[k]
for k in dict1.keys() & dict2.keys()
if dict2[k]["mileage"] >= dict1[k]["mileage"]
and dict2[k]["speed"] >= dict1[k]["speed"]
]
print(result)
输出:
[{'vehicle': 1, 'mileage': 25, 'speed': 80}, {'vehicle': 2, 'mileage': 35, 'speed': 70}]
TA贡献1818条经验 获得超7个赞
我会使用熊猫数据框。不是最有效但非常易读的
import pandas as pd
df1 = pd.DataFrame(list1)
df2 = pd.DataFrame(list2)
result_df = df1[(df1.vehicle.isin(df2.vehicle)) & (df1.speed <= df2.speed) & (df1.mileage <= df2.mileage)]
result_list = result_df.to_dict('records')
print(result_list)
输出:
[{'mileage': 25, 'speed': 80, 'vehicle': 1},
{'mileage': 35, 'speed': 70, 'vehicle': 2}]
添加回答
举报
