Wpis z mikrobloga

Witam,

mam listę np [('a', 10), ('a', 10), ('a', 10), ('b', 12), ('b', 12), ('c', 15)]

a potrzebuję mieć [('a',30), ('b','24'), ('c', 15)] czyli po prostu suma

już lecę 10 godzin i trochę mózg zrobił się papka a potrzebne mi żebym dziś to skończył a nie mogę wpaść na elegancki sposób
:(( pomocy

#python #programowanie
  • 18
@muskel: niezależnie od języka jest to bardzo proste do zrobienia, jeżeli nie masz żadnych wymagań czasowych lub pamięciowych to można to zrobić tak:

1. Stwórz posortowany kontener mapę/drzewo która może przyjąć parę klucz wartość.

2. w pętli przejeżdasz po swojej liście z tymi wszystkimi itemami.

Sprawdzasz warunek. Jeżeli w Twoim koneterze istnieje już taki klucz, do jego wartości dodaj wartość z listy po której iterujesz, w przeciwnym wypadku dodaj nowy wpis.
@muskel:

from functools import reduce
items = [('a', 10), ('a', 10), ('a', 10), ('b', 12), ('b', 12), ('c', 15)]
sums = reduce(lambda acc, x: {**acc, **{x[0]: acc.get(x[0], 0) + x[1]}}, items, {})
@zarev: Ekhm, wydajność w Pythonie ( ͡° ͜ʖ ͡°) i ogromny koszt tworzenia jednego z prymitywów, nice one. A co do czytelności rozwiązania gdyby dało się dekonstruować krotki w liście argumentów jak np. w JS to byłoby meega czytelne + chciałem trochę funkcyjnie popisać. Obstawiam że dałoby się to jeszcze delikatnie uprościć (musiałbym popatrzeć na union dicta).
@mackarr: Tak, wywołanie funkcji (stos, ramki, zasięgi). Dlatego też wolne są rozwiązania oparte o collections.defaultdict oraz dict.setdefault.
Ostatecznie te parametry gdzieś muszą trafić, musi być skok do funkcji, zebranie tych parametrów, ich przetworzenie, zwrot do miejsca sprzed wywołania. Dlatego po prostu po studencku "not in" jest tutaj dużo wydajniejszy.

W Twoim kodzie zrobiłem małą optymalizację - przypisałem lambdę do zmiennej, i przy dużej ilości wywołań (10mln) wychodzi ~1sek różnicy. I tego