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

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

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'}
]
添加回答
舉報