亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將字典列表與每個列表中可變數量的字典進行比較

將字典列表與每個列表中可變數量的字典進行比較

心有法竹 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 關注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號