список словарей python добавляет значение по ключу

#python

Вопрос:

 data = [   {  'name': 'Jack',  'points': 10  },  {  'name': 'John',  'points': 12  },  {  'name': 'Jack',  'points': 15  },  {  'name': 'Harry',  'points': 11  } ]  

Выход:

Джек: 25 очков , Джон: 12 очков , Гарри: 11 очков

Есть ли в любом случае способ достичь этого без использования цикла for ?

Я могу добиться этого, сохранив пару значений ключа или имя и точки и добавив точки, если они уже существуют в словаре. Но есть ли какой-либо альтернативный способ достичь этого ?

Комментарии:

1. Есть ли в любом случае способ достичь этого без использования цикла for? Насколько я знаю, НЕТ. Почему вы думаете, что вам нужно избегать цикла for?

2. Каждый цикл for может быть заменен циклом while. Есть также понимание диктантов, но на самом деле это циклы с более короткой нотацией.

3. Почему вы хотите сделать это без for цикла ? Я имею в виду, может быть , вы можете использовать понимание списка или join , но любое решение, которое вы получите, по своей сути является циклом for. Вам придется повторять все элементы вашего списка, какое бы решение вы ни нашли

4. Если вы хотите скрыть for петлю, вы можете сделать что-то глупое и нечитаемое, например functools.reduce(lambda a, p: (a.__setitem__(p["name"], a.get(p["name"],0) p["points"]), a)[1], data, {}) , получить {'Jack': 25, 'John': 12, 'Harry': 11} … но, пожалуйста, не надо.

Ответ №1:

Вы можете использовать groupby из itertools :

 from itertools import groupby  key = lambda d: d['name'] result = {n: sum(v['points'] for v in vs) for n, vs in groupby(sorted(data, key=key), key)}  

Результат:

 {'Harry': 11, 'Jack': 25, 'John': 12}  

Комментарии:

1. groupby группирует только последующие элементы с одним и тем же ключом. В данных ОП есть Джек/Джон/Джек/Гарри…

2. @AKX Спасибо, обновлено

3. Тем не менее, там есть ключевое слово OP dreads, for ,…:)

4. @AKX Я полагаю, что это не «цикл для» как таковой. И обычно «без использования цикла for» означает «в одной строке».