列表中的Python计数字典具有相同的值

时间:2017-12-08 03:06:59

标签: python

我有这样的说法:

list_dicts = [
    {
        'code': 'A1', 'name': 'White',
    },
    {
        'code': 'A2', 'name': 'Black',
    },
    {
        'code': 'A1', 'name': 'White',
    },
    {
        'code': 'A3', 'name': 'Red',
    }
]

如何从上面的词汇中得到这样的词汇?

list_dicts = [
    {
        'code': 'A1', 'name': 'White', 'qty': 2
    },
    {
        'code': 'A2', 'name': 'Black', 'qty': 1
    },
    {
        'code': 'A3', 'name': 'Red', 'qty': 1
    }
]

..........................

2 个答案:

答案 0 :(得分:3)

假设您确实有一个dicts列表:

list_dict = [
    {'code': 'A1', 'name': 'White'},
    {'code': 'A2', 'name': 'Black'},
    {'code': 'A1', 'name': 'White'},
    {'code': 'A3', 'name': 'Red'}
]

然后您可以使用collections.Counter来计算值:

In []:
from collections import Counter
Counter((x['code'], x['name']) for x in list_dict)

Out[]:
Counter({('A1', 'White'): 2, ('A2', 'Black'): 1, ('A3', 'Red'): 1})

将其重新转换为您正在寻找的词典列表是一项相当容易的练习。

答案 1 :(得分:0)

只需使用defaultdict来存储每个(code, name)的计数:

from collections import defaultdict

list_dict = [{'code': 'A1', 'name': 'White'},
             {'code': 'A2', 'name': 'Black'},
             {'code': 'A1', 'name': 'White'},
             {'code': 'A3', 'name': 'Red'},
            ]

d = defaultdict(int)
for dic in list_dict:
    key = dic['code'], dic['name']
    d[key] += 1

>>> print(dict(d))
{('A1', 'White'): 2, ('A2', 'Black'): 1, ('A3', 'Red'): 1}

然后只需创建一个新列表,并从上面的字典中插入新数据:

new_dict_list = [{'code':code, 'name':name, 'qty':qty} for (name, code), qty in d.items()]

>>> print(new_dict_list)
[{'code': 'A1', 'name': 'White', 'qty': 2}, {'code': 'A2', 'name': 'Black', 'qty': 1}, {'code': 'A3', 'name': 'Red', 'qty': 1}]