简体   繁体   English

合并 2 个字典列表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM