将字典列表与每个列表中可变数量的字典进行比较

我有两个字典列表:


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}

]

如果 list2 上有同名车辆,并且相应车辆的里程和速度大于或等于 list2 中的,我必须从 list1 打印字典。在此示例中,输出应为:


[{'vehicle': 1, 'mileage': 25, 'speed': 80}, 

 {'vehicle': 2, 'mileage': 35, 'speed': 70}]

非常感谢任何帮助。


心有法竹
浏览 152回答 3
3回答

jeck猫

您可以创建一个查找字典来搜索相应的匹配项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).

慕村225694

您可以将您的字典列表转换为嵌套字典,其中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}]

qq_笑_17

我会使用熊猫数据框。不是最有效但非常易读的import pandas as pddf1 = 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},&nbsp;{'mileage': 35, 'speed': 70, 'vehicle': 2}]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python