#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» означает «в одной строке».