簡體   English   中英

根據字典中的索引合並兩個字典列表

[英]Merge two list of dicts based on an index in the dicts

這兩個是相關的數據集,但來自單獨的 json 文件,所以我想合並它們。 他們可以在索引上匹配,但我並沒有真正找到這樣做的好方法:)

字典列表 1:

[
  {'index': 217, 'name': 'Battery'}
  {'index': 218, 'name': 'Fluffy'}
  {'index': 219, 'name': 'Dazzling'}
  {'index': 220, 'name': 'Soul-Heart'}
]

字典清單 2:

[
  {'index': 217, 'desc': 'Text info 2'}
  {'index': 218, 'desc': 'will be very informative'}
  {'index': 219, 'desc': 'dont know what else i could write here'}
  {'index': 220, 'desc': 'Boosts my wallet'}
]

結果應該是這樣的:

[
  {'index': 217, 'name': 'Battery', 'desc': 'Text info 2'}
  {'index': 218, 'name': 'Fluffy', 'desc': 'will be very informative'}
  {'index': 219, 'name': 'Dazzling', 'desc': 'dont know what else i could write here'}
  {'index': 220, 'name': 'Soul-Heart', 'desc': 'Boosts my wallet'}
]

有更多的數據,但一旦我知道如何合並,我想我可以做 rest

Pandas 輕而易舉地處理合並

首先將數據轉換為數據幀:

import pandas as pd

data1 = [
    {'index': 217, 'name': 'Battery'},
    {'index': 218, 'name': 'Fluffy'},
    {'index': 219, 'name': 'Dazzling'},
    {'index': 220, 'name': 'Soul-Heart'},
]
data2 = [
    {'index': 217, 'desc': 'Text info 2'},
    {'index': 218, 'desc': 'will be very informative'},
    {'index': 219, 'desc': 'dont know what else i could write here'},
    {'index': 220, 'desc': 'Boosts my wallet'},
]
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)

然后在index列上合並:

df_out = df1.merge(df2, on='index')

看起來像這樣:

   index        name                                    desc
0    217     Battery                             Text info 2
1    218      Fluffy                will be very informative
2    219    Dazzling  dont know what else i could write here
3    220  Soul-Heart                        Boosts my wallet

然后轉換回字典列表:

df_out.to_dict(orient='records')
[{'index': 217, 'name': 'Battery', 'desc': 'Text info 2'},
 {'index': 218, 'name': 'Fluffy', 'desc': 'will be very informative'},
 {'index': 219, 'name': 'Dazzling', 'desc': 'dont know what else i could write here'},
 {'index': 220, 'name': 'Soul-Heart', 'desc': 'Boosts my wallet'}]

要合並 Python 中具有公共鍵值對的兩個字典,您可以對其中一個字典使用 update() 方法。 此方法將使用第二個字典中的值覆蓋公共鍵值對。

dict1.update(dict2)

這應該會給你預期的結果,但如果公共鍵值對不同,它將從第二個字典中挑選出來,第一個字典值將被覆蓋。

我假設index鍵中的值在每個列表中都是唯一的:

lst1 = [
    {"index": 217, "name": "Battery"},
    {"index": 218, "name": "Fluffy"},
    {"index": 219, "name": "Dazzling"},
    {"index": 220, "name": "Soul-Heart"},
]

lst2 = [
    {"index": 217, "desc": "Text info 2"},
    {"index": 218, "desc": "will be very informative"},
    {"index": 219, "desc": "dont know what else i could write here"},
    {"index": 220, "desc": "Boosts my wallet"},
]


tmp1 = {d["index"]: d["name"] for d in lst1}
tmp2 = {d["index"]: d["desc"] for d in lst2}

out = []
for k in tmp1.keys() & tmp2.keys():
    out.append(
        {"index": k, "name": tmp1.get(k, "N/A"), "desc": tmp2.get(k, "N/A")}
    )

print(out)

印刷:

[
    {"index": 217, "name": "Battery", "desc": "Text info 2"},
    {"index": 218, "name": "Fluffy", "desc": "will be very informative"},
    {
        "index": 219,
        "name": "Dazzling",
        "desc": "dont know what else i could write here",
    },
    {"index": 220, "name": "Soul-Heart", "desc": "Boosts my wallet"},
]

這會起作用,但效率很低,因為您必須遍歷每個列表的每個字典。 如果您能夠更改數據結構,這樣您就不會遍歷列表中的字典,那就更好了。 看看是否可以更改它,以便您擁有類似...

dicts2 = {
  217 : {'desc': 'Text info 2'},
  218 : {'desc': 'will be very informative'},
  219 : {'desc': 'dont know what else i could write here'},
  220 : {'desc': 'Boosts my wallet'}
}

通過這種方式,您可以利用 dict 作為數據結構並查找所需的項目,而不是遍歷每個項目(與列表一樣)

但這是您現在的解決方案:

dicts1 = [
  {'index': 217, 'name': 'Battery'},
  {'index': 218, 'name': 'Fluffy'},
  {'index': 219, 'name': 'Dazzling'},
  {'index': 220, 'name': 'Soul-Heart'}
]

dicts2 = [
  {'index': 217, 'desc': 'Text info 2'},
  {'index': 218, 'desc': 'will be very informative'},
  {'index': 219, 'desc': 'dont know what else i could write here'},
  {'index': 220, 'desc': 'Boosts my wallet'}
]

for d1 in dicts1:
    for d2 in dicts2:
        if d1['index'] == d2['index']:
            for key, value in d1.items():
                d2[key] = value
            
print(dicts2)
--------------------------------------------------------------
[
  {'index': 217, 'desc': 'Text info 2', 'name': 'Battery'}, 
  {'index': 218, 'desc': 'will be very informative', 'name': 'Fluffy'}, 
  {'index': 219, 'desc': 'dont know what else i could write here', 'name': 'Dazzling'}, 
  {'index': 220, 'desc': 'Boosts my wallet', 'name': 'Soul-Heart'}
]

要對列表執行此合並,請使用:

a = [{'index': 217, 'name': 'Battery'},{'index': 218, 'name': 'Fluffy'},{'index': 219, 'name': 'Dazzling'}, {'index': 220, 'name': 'Soul-Heart'}]

b = [{'index': 217, 'desc': 'Text info 2'},{'index': 218, 'desc': 'will be very informative'},{'index': 219, 'desc': 'dont know what else i could write here'},{'index': 220, 'desc': 'Boosts my wallet'}]


final_lst = []
for first, second in zip(a,b):
    first.update(second)
    final_lst.append(first)
print(final_lst)

暫無
暫無

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

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