簡體   English   中英

Python3 - 比較兩個字典列表並更新值

[英]Python3 - Compare two lists of dictonaries and update value

我有兩個列表(這些列表將有數百條記錄),但這里是示例:

list1 = [
{'VENDOR': 'VENDOR1', 'VLAN': '500', 'OUI': []},
{'VENDOR': 'VENDOR2', 'VLAN': '600', 'OUI': []},
{'VENDOR': 'VENDOR3', 'VLAN': '700', 'OUI': []},
]

list2 = [
{'VLAN': '500', 'OUI': '0001FC'},
{'VLAN': '600', 'OUI': '00D024'},
{'VLAN': '500', 'OUI': '00D024'},
{'VLAN': '700', 'OUI': '00D024'},
{'VLAN': '700', 'OUI': '023456'},
]

我想從 list2 中取出兩個列表之間 VLAN 匹配的每個 OUI,然后將其添加到 list1 中 OUI 鍵的值中。 (我想這可能需要第三個字典來保存所有內容)。

最終結果將是這樣的:

list3 = [
{'VENDOR': 'VENDOR1', 'VLAN': '500', 'OUI': ["0001FC", "00D024"]},
{'VENDOR': 'VENDOR2', 'VLAN': '600', 'OUI': ["00D024"]},
{'VENDOR': 'VENDOR3', 'VLAN': '700', 'OUI': ["00D024", "023456"]}
]

我什至不確定從哪里開始,因此不勝感激。

這是一種方法,關於

(我想這可能需要第三個字典來保存所有內容)

那沒必要

list1 = [
  {'VENDOR': 'VENDOR1', 'VLAN': '500', 'OUI': []},
  {'VENDOR': 'VENDOR2', 'VLAN': '600', 'OUI': []},
  {'VENDOR': 'VENDOR3', 'VLAN': '700', 'OUI': []},
]

list2 = [
  {'VLAN': '500', 'OUI': '0001FC'},
  {'VLAN': '600', 'OUI': '00D024'},
  {'VLAN': '500', 'OUI': '00D024'},
  {'VLAN': '700', 'OUI': '00D024'},
  {'VLAN': '700', 'OUI': '023456'},
]

# to hold indexes of VLAN in list1 so it will be easy to 
# append to the right "OUI" list inside list1
indexes = {}

# get the index of each VLAN
for i in range(len(list1)):
  indexes[list1[i]["VLAN"]] = i
# `indexes` now => {"500": 0, "600": 1, "700": 2}
for a in list2:
  # now it's easy to target the right `"OUI"` list
  # for example the first iteration
  # list1[0]["OUI"].append("0001FC")
  list1[indexes[a["VLAN"]]]["OUI"].append(a["OUI"])

print(list1)

Output:

[
  {'VENDOR': 'VENDOR1', 'VLAN': '500', 'OUI': ['0001FC', '00D024']},
  {'VENDOR': 'VENDOR2', 'VLAN': '600', 'OUI': ['00D024']},
  {'VENDOR': 'VENDOR3', 'VLAN': '700', 'OUI': ['00D024', '023456']}
]

您需要執行該操作的代碼在這里:

 for i in range(0,len(list1)):
      for j in range(0,len(list2)):
          if(list1[i]["VLAN"] == list2[j]["VLAN"]):
              list1[i]["OUI"].append(list2[j]["OUI"])

並測試您是否得到正確的輸出,您可以使用以下代碼:

 for i in range(0,len(list1)):
        print(list1[i]["OUI"])

我相信這段代碼是不言自明的,但如果你想解釋為什么會這樣,請隨時提問。

我會將list1重組為嵌套字典,其中VLAN是鍵,然后迭代list2並將VLAN項添加到嵌套字典中的OUI列表中。 然后我們可以打印嵌套字典的values()

list1 = [
    {"VENDOR": "VENDOR1", "VLAN": "500", "OUI": []},
    {"VENDOR": "VENDOR2", "VLAN": "600", "OUI": []},
    {"VENDOR": "VENDOR3", "VLAN": "700", "OUI": []},
]

list2 = [
    {"VLAN": "500", "OUI": "0001FC"},
    {"VLAN": "600", "OUI": "00D024"},
    {"VLAN": "500", "OUI": "00D024"},
    {"VLAN": "700", "OUI": "00D024"},
    {"VLAN": "700", "OUI": "023456"},
]

vendors = {v["VLAN"]: v for v in list1}
# {'500': {'VENDOR': 'VENDOR1', 'VLAN': '500', 'OUI': []}, '600': {'VENDOR': 'VENDOR2', 'VLAN': '600', 'OUI': []}, '700': {'VENDOR': 'VENDOR3', 'VLAN': '700', 'OUI': []}}

for vlan in list2:
    vendors[vlan["VLAN"]]["OUI"].append(vlan["OUI"])

print(list(vendors.values()))

Output:

[{'VENDOR': 'VENDOR1', 'VLAN': '500', 'OUI': ['0001FC', '00D024']}, {'VENDOR': 'VENDOR2', 'VLAN': '600', 'OUI': ['00D024']}, {'VENDOR': 'VENDOR3', 'VLAN': '700', 'OUI': ['00D024', '023456']}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM