为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

心有法竹 2022-10-18 14:48:44
我有两个字典列表: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}]非常感谢任何帮助。
查看完整描述

3 回答

?
jeck猫

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).


查看完整回答
反对 回复 2022-10-18
?
慕村225694

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}]



查看完整回答
反对 回复 2022-10-18
?
qq_笑_17

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}]


查看完整回答
反对 回复 2022-10-18
  • 3 回答
  • 0 关注
  • 151 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号