Trying to think of a one-liner to achieve the following ( summing all the values of a key) :
>>> data = [('a',1),('b',3),('a',4),('c',9),('b',1),('d',3)]
>>> res = {}
>>> for tup in data:
... res[tup[0]] = res.setdefault(tup[0],0) + tup[1]
...
>>> res
{'a': 5, 'c': 9, 'b': 4, 'd': 3}
One-liner version without using any imports like itertools,collections etc.
{ tup[0] : SELF_REFERENCE.setdefault(tup[0],0) + tup[1] for tup in data }
Is it possible in Python to use a reference to the object currently being comprehended ? If not, is there any way to achieve this in a one-liner without using any imports i.e. using basic list/dict comprehension and inbuilt functions.
Its syntax is the same as List Comprehension. It returns a generator object. A dict comprehension, in contrast, to list and set comprehensions, needs two expressions separated with a colon. The expression can also be tuple in List comprehension and Set comprehension.
The idea of comprehension is not just unique to lists in Python. Dictionaries, one of the commonly used data structures in data science, can also do comprehension.
The concept of a break or a continue doesn't really make sense in the context of a map or a filter , so you cannot include them in a comprehension.
You are testing with way too small an input; while a dictionary comprehension doesn't have as much of a performance advantage against a for loop when compared to a list comprehension, for realistic problem sizes it can and does beat for loops, especially when targeting a global name.
No, there is not. A dict comprehension produces a new item for each iteration, and your code needs to produce fewer items (consolidating values).
There is no way to access keys produced in an earlier iteration, not without using (ugly, unpythonic) side-effect tricks. The dict
object that is going to be produced by the comprehension doesn't exist yet, so there is no way to produce a self-reference either.
Just stick to your for
loop, it is far more readable.
The alternative would be to use sorting and grouping, a O(NlogN) algorithm vs. the simple O(N) of your straight loop:
from itertools import groupby
from operator import itemgetter
res = {key: sum(t[1] for t in group)
for key, group in groupby(sorted(data, key=itemgetter(0)), key=itemgetter(0))}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With