第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

合并多個鍵不一致的字典

合并多個鍵不一致的字典

泛舟湖上清波郎朗 2021-11-23 19:00:37
我是一名 Python 初學者,正在努力解決以下問題:我正在嘗試將多個列表與從多個 json 解碼的嵌套字典合并。列表之間的共同點是每個嵌套字典的“uid”鍵對應于一個名稱,但問題是某些字典的鍵名稱不同。例如,代替“uid”,字典可能有“number”作為鍵。我想將它們的一部分合并到一個超級嵌套字典列表中。為了說明,我所擁有的是:masterlist = [ ]listA = [{"uid": "12345", "name": "John Smith"}, {etc...}]listB = [{"number": "12345", "person": "John Smith", "val1": "25"}, {etc...}]listC = [{"number": "12345", "person": "John Smith", "val2": "65"}, {etc...}]我想結(jié)束的是:masterlist = [{"uid": "12345", "name": "John Smith", "val1": "25", "val2: "65"}, {etc...}]這是否可以通過迭代和比較相同的“uid”值來有效/pythonically 完成?我已經(jīng)看到很多關(guān)于通過匹配鍵進行合并的操作方法,但這里的問題顯然是鍵不一致。排序無所謂。我所需要的只是讓主列表包含每個 dict 條目的相應 uid、名稱和值。希望這是有道理的,謝謝!
查看完整描述

3 回答

?
慕標琳琳

TA貢獻1830條經(jīng)驗 獲得超9個贊

可能有使用 base python 的解決方案,但我能想到的最簡單的方法是使用 pandas 庫將每個列表轉(zhuǎn)換為 DataFrame,然后將它們連接/合并在一起。


import pandas as pd


dfA = pd.DataFrame(listA)

dfB = pd.DataFrame(listB)


merged_df = dfA.merge(dfB, left_on='uid', right_on='number')

這將返回一個包含比您需要的更多列的 DataFrame(即“uid”和“number”都有列),但您可以通過這種方式指定您想要的列以及您想要它們的順序:


merged_df = merged_df[['uid', 'name', 'val1']]

要將多個 DataFrames 合并到一個主框架中,請參見此處:pandasthree -way joins multiple dataframes on columns


查看完整回答
反對 回復 2021-11-23
?
慕雪6442864

TA貢獻1812條經(jīng)驗 獲得超5個贊

您可以在沒有 Pandas 的情況下使用列表推導式來完成此操作,該推導式構(gòu)建字典字典,按“uid”對列表字典進行分組。然后使用該分組字典的 .values() 再次獲取字典列表:


listA = [{"uid": "12345", "name": "John Smith"},{"uid": "67890", "name": "Jane Doe"}]


listB = [{"number": "12345", "person": "John Smith", "val1": "25"},{"number": "67890", "val1": "37"}]


listC = [{"number": "12345", "person": "John Smith", "val2": "65"},{"number": "67890", "val2": "53"}]


from collections import defaultdict

fn     = { "number":"uid", "person":"name" } # map to get uniform key names

data   = [ { fn.get(k,k):v for k,v in d.items() } for d in listA+listB+listC ]

result = next(r for r in [defaultdict(dict)] if [r[d["uid"]].update(d) for d in data])

print(*result.values())


{'uid': '12345', 'name': 'John Smith', 'val1': '25', 'val2': '65'} 

{'uid': '67890', 'name': 'Jane Doe', 'val1': '37', 'val2': '53'}


查看完整回答
反對 回復 2021-11-23
?
慕神8447489

TA貢獻1780條經(jīng)驗 獲得超1個贊

您應該將所有輸入列表放在列表列表中,以便您可以構(gòu)建一個映射uid到具有聚合項目值的 dict 的 dict,這樣您所需的 dict 列表將只是映射的 dict 值。為了允許在不同的輸入字典中對鍵的命名不一致,pop您不想要的那些(例如number和id在我的示例中)并使用您想要保留的鍵分配給字典(例如uid在示例中):


wanted_key = 'uid'

unwanted_keys = {'number', 'id'}

mapping = {}

for l in lists:

    for d in l:

        if wanted_key not in d:

            d[wanted_key] = d.pop(unwanted_keys.intersection(d).pop())

        mapping.setdefault(d[wanted_key], {}).update(d)

masterlist = list(mapping.values())

所以給出:


lists = [

    [

        {"uid": "12345", "name": "John Smith"},

        {"uid": "56789", "name": "Joe Brown", "val1": "1"}

    ],

    [

        {"number": "12345", "name": "John Smith", "val1": "25"},

        {"number": "56789", "name": "Joe Brown", "val2": "2"}

    ],

    [

        {"id": "12345", "name": "John Smith", "val2": "65"}

    ]

]

masterlist 變成:


[

    {'uid': '12345', 'name': 'John Smith', 'val1': '25', 'val2': '65'},

    {'uid': '56789', 'name': 'Joe Brown', 'val1': '1', 'val2': '2'}

]


查看完整回答
反對 回復 2021-11-23
  • 3 回答
  • 0 關(guān)注
  • 248 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號