在列表中查找并计算相等的字典

Find and count equal dicts inside a list

我有一个包含多个字典的列表,我需要检查哪些字典被重复并创建一个新列表,每个字典只出现一次,但第一个列表中重复元素的数量。

例如:

我有那个列表:

[{'a': 123, 'b': 1234, 'c': 'john', 'amount': 1},
 {'a': 456, 'b': 1234, 'c': 'doe','amount': 1},
 {'a': 456, 'b': 1234, 'c': 'steve','amount': 1},
 {'a': 123, 'b': 1234, 'c': 'john','amount': 1},
 {'a': 123, 'b': 1234, 'c': 'john','amount': 1}]

我需要输出:

[{'a': 123, 'b': 1234, 'c': 'john', 'amount': 3},
{'a': 456, 'b': 1234, 'c': 'steve','amount': 1},
{'a': 456, 'b': 1234, 'c': 'doe','amount': 1}]

我已经尝试了一些我通过谷歌搜索发现的东西,但没有任何效果,我最后一次尝试让我知道重复的东西在哪里,但我不知道下一步该怎么做。

def index(lst, element):
    result = []
    offset = -1
    while True:
        try:
            offset = lst.index(element, offset+1)
        except ValueError:
            return result
        result.append(offset)

for i in l:
    if len(index(l,i)) > 1:
        i['amount'] += 1
print l

但是returns

[{'a': 123, 'c': 'john', 'b': 1234, 'amount': 2}, 
 {'a': 456, 'c': 'doe', 'b': 1234, 'amount': 1}, 
 {'a': 456, 'c': 'steve', 'b': 1234, 'amount': 1}, 
 {'a': 123, 'c': 'john', 'b': 1234, 'amount': 2}, 
 {'a': 123, 'c': 'john', 'b': 1234, 'amount': 1}]

这里有一个使用pandas的选项,通过它我们可以将字典连接成一个数据框,然后我们可以将a,b和c列分组并计算金额之和。如果我们想要一个字典,pandas 数据框有一个内置的 to_dict() 函数。将参数指定为index,我们可以得到一个字典作为所需的输出:

import pandas as pd
list(pd.DataFrame(mylist).groupby(['a', 'b', 'c']).sum().reset_index().to_dict('index').values())

# [{'a': 123, 'amount': 3, 'b': 1234, 'c': 'john'},
#  {'a': 456, 'amount': 1, 'b': 1234, 'c': 'doe'},
#  {'a': 456, 'amount': 1, 'b': 1234, 'c': 'steve'}]