[英]Merging 2 lists of dictionaries
i have the following list of dictionaies:我有以下词典列表:
{'posid': 'AZDEMOBirminghamB134', 'cardscheme': 'Visa Debit', 'sumRefund': 298}
{'posid': 'AZDEMOBirminghamB134', 'cardscheme': 'Visa Debit', 'sumCashBack': 10586}
{'posid': 'AZDEMOBirminghamB134', 'cardscheme': 'MasterCard', 'sumTotal': 14}
{'posid': 'AZDEMOBirminghamB134', 'cardscheme': 'Visa', 'sumTotal': 10}
{'posid': 'AZDEMOBirminghamB134', 'cardscheme': 'Visa Debit', 'sumTotal': 40}
how would i merge these so that the cardscheme key is unique - this will involve merging the sumRefund and sumCashback into the same line ( example shwon below), but i can't figure it out.我将如何合并这些以使 cardscheme 键是唯一的 - 这将涉及将 sumRefund 和 sumCashback 合并到同一行(下面的示例 shwon),但我无法弄清楚。
{'posid': 'AZDEMOBirminghamB134', 'cardscheme': 'MasterCard', 'sumTotal': 14}
{'posid': 'AZDEMOBirminghamB134', 'cardscheme': 'Visa', 'sumTotal': 10}
{'posid': 'AZDEMOBirminghamB134', 'cardscheme': 'Visa Debit', 'sumTotal': 40, 'sumRefund': 298, 'sumCashBack': 10586}
You can use the dictionary update method together with defaultdict .您可以将字典更新方法与defaultdict一起使用。 Assuming that
L
is the original list:假设
L
是原始列表:
from collections import defaultdict
cardschemes_rules = defaultdict(dict)
for dic in L:
cardschemes_rules[dic['cardscheme'] + dic['posid']].update(dic)
cardschemes_rules.values()
As you requested in the comment, each output correspond to the union of keys for a given (cardscheme, posid)
pair.正如您在评论中要求的那样,每个 output 对应于给定
(cardscheme, posid)
对的密钥联合。
Running this code with the following L
:使用以下
L
运行此代码:
L = [
{'posid': 'A', 'cardscheme': 'Visa Debit', 'sumRefund': 2.98},
{'posid': 'A', 'cardscheme': 'Visa Debit', 'sumCashBack': 105.86},
{'posid': 'A', 'cardscheme': 'MasterCard', 'sumTotal': .14},
{'posid': 'A', 'cardscheme': 'Visa Debit', 'sumTotal': .40},
{'posid': 'B', 'cardscheme': 'Visa Debit', 'sumRefund': 298},
{'posid': 'B', 'cardscheme': 'Visa Debit', 'sumCashBack': 10586},
{'posid': 'B', 'cardscheme': 'Visa', 'sumTotal': 10},
]
Would produce cardschemes_rules.values()
:会产生
cardschemes_rules.values()
:
{'posid': 'A', 'cardscheme': 'Visa Debit', 'sumRefund': 2.98, 'sumCashBack': 105.86, 'sumTotal': 0.4}
{'posid': 'A', 'cardscheme': 'MasterCard', 'sumTotal': 0.14}
{'posid': 'B', 'cardscheme': 'Visa Debit', 'sumRefund': 298, 'sumCashBack': 10586}
{'posid': 'B', 'cardscheme': 'Visa', 'sumTotal': 10}
If you have name collisions in your input, the last entry in the input list will remain (value are replaced by a new one every time update
is applied).如果您的输入中有名称冲突,则输入列表中的最后一个条目将保留(每次应用
update
时,值都会被一个新条目替换)。
I'd use pandas:我会使用 pandas:
import pandas as pd
data = [
{'posid': 'AZDEMOBirminghamB134', 'cardscheme': 'Visa Debit', 'sumRefund': 298},
{'posid': 'AZDEMOBirminghamB134', 'cardscheme': 'Visa Debit', 'sumCashBack': 10586},
{'posid': 'AZDEMOBirminghamB134', 'cardscheme': 'MasterCard', 'sumTotal': 14},
{'posid': 'AZDEMOBirminghamB134', 'cardscheme': 'Visa', 'sumTotal': 10},
{'posid': 'AZDEMOBirminghamB134', 'cardscheme': 'Visa Debit', 'sumTotal': 40}
]
df = pd.DataFrame()
for line in data:
df = df.append(line, ignore_index=True)
df = df.fillna(0)
df = df.groupby('cardscheme').sum()
df.to_csv('test.csv')
Hope I helped:-)希望我有所帮助:-)
Tried with minimum iterations but this is the best I cameup with.尝试了最少的迭代,但这是我想出的最好的。
Code:代码:
lst = [{'posid': 'AZDEMOBirminghamB134', 'cardscheme': 'Visa Debit', 'sumRefund': 298},
{'posid': 'AZDEMOBirminghamB134', 'cardscheme': 'Visa Debit', 'sumCashBack': 10586},
{'posid': 'AZDEMOBirminghamB134', 'cardscheme': 'MasterCard', 'sumTotal': 14},
{'posid': 'AZDEMOBirminghamB134', 'cardscheme': 'Visa', 'sumTotal': 10},
{'posid': 'AZDEMOBirminghamB134', 'cardscheme': 'Visa Debit', 'sumTotal': 40}]
uniq_lst = []
for dct in lst:
updated = False
for dct_res in uniq_lst:
if dct_res['posid'] == dct['posid'] and dct_res['cardscheme'] == dct['cardscheme']:
dct_res[list(dct.keys())[2]] = list(dct.values())[2]
updated = True
break
else:
uniq_lst.append(dct)
updated = True
if not updated:
uniq_lst.append(dct)
for ele in uniq_lst:
print(ele)
Output: Output:
{'posid': 'AZDEMOBirminghamB134', 'cardscheme': 'Visa Debit', 'sumRefund': 298, 'sumCashBack': 10586, 'sumTotal': 40}
{'posid': 'AZDEMOBirminghamB134', 'cardscheme': 'MasterCard', 'sumTotal': 14}
{'posid': 'AZDEMOBirminghamB134', 'cardscheme': 'Visa', 'sumTotal': 10}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.