Подсчитать значения в списке словарей python - PullRequest
1 голос
/ 13 апреля 2020

Как посчитать значения в списке словарей с условием соответствия

test_dicts = [
    {
        'int_count': 1,
        'code': ['500'],
        'unique_id': '11',
    },
    {
        'int_count': 1,
        'code': ['201'],
        'unique_id': '11',
    },
    {
        'int_count': 6,
        'code': ['202', '200', '201', '205', '226', '228'],
        'unique_id': '11',
    },
    {
        'int_count': 1,
        'code': ['303'],
        'unique_id': '12',
    },
    {
        'int_count': 5,
        'code': ['309', '301', '203', '208', '252'],
        'unique_id': '12',
    }
]

Результат, который я ожидаю, основан на суммировании int_count элементов с одинаковыми unique_id:

Output = [{'unique_id':11, 'int_count':8}, {'unique_id':12, 'int_count':6}

Ответы [ 2 ]

4 голосов
/ 13 апреля 2020

Я бы использовал defaultdict, чтобы собрать счетчики, а затем создать список в нужном формате:

from collections import defaultdict

counts = defaultdict(int)
for d in test_dicts:
    counts[d['unique_id']] += d['int_count']

print([
    {'unique_id': unique_id, 'int_count': int_count}
    for unique_id, int_count in counts.items()
])
3 голосов
/ 13 апреля 2020

Перефразируя вопрос:

Я собираюсь немного упростить ваш ввод, поскольку есть забавный ключ, и списки, кажется, игнорируются (не проверяется на уникальность).

values = [
    {'count': 1, 'id': '11'},
    {'count': 1, 'id': '11'},
    {'count': 6, 'id': '11'},
    {'count': 1, 'id': '12'},
    {'count': 5, 'id': '12'},
]

Тогда вопрос заключается в группировке по 'id 'и сумме 'count', например:

assert res == [{'id':11, 'count':8}, {'id':12, 'count':6}]

Ответ

Вы можете сделать это разными способами, но почти во всех случаях это будет чисто и быстро использовать collections.Counter.

from collections import Counter

# Get results
counts = Counter()
for val in values:
    counts[val['id']] += val['count']

# Change to desired output format
res = [{'id': k, 'count': v} for k, v in counts.items()]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...