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}]
添加回答
舉報