Столько, сколько я люблю groupby
, я не думаю, что это хорошая идея здесь.Ваши элементы чередуются veg
и non-veg
, но groupby
ожидает, что группы будут смежными, что означает, что это сработает только при первом вызове sorted
, после чего вы отбрасываете всю простоту и производительностьПреимущества итеративного выполнения действий.
Между тем, без сортировки будет гораздо проще создать диктовку, основанную на значениях ключей, чем список, который вы должны продолжать искать для каждого ключа.Например:
d = collections.defaultdict(lambda: dict(count=0, price=[], quality=''))
for entry in A:
key = entry['key']
target = d[key]
target['count'] += entry['count']
target['price'].extend(entry['price'])
target['quality'] = 'something' # I don't know what your aggregation rule is
Теперь d
выглядит следующим образом:
defaultdict(<function __main__.<lambda>>,
{'non-veg': {'count': 250,
'price': [10, 20, 30, 110, 220, 330]],
'quality': 'something'},
'veg': {'count': 300,
'price': [100, 200, 300, 1, 2, 3]],
'quality': 'something'}})
И если вам действительно нужен список в конце, это просто:
[dict(key=key, **value) for key, value in d.items()]
В качестве альтернативы, если структура dict оказывается более полезной, чем список, просто используйте это.(Используйте dict.setdefault
вместо defaultdict
или d = dict(d)
в конце, если вы не хотите, чтобы KeyError
s в последующих поисках превратились в значения по умолчанию, конечно.)