Quint Rankid wrote: > Newbie question. I've googled a little and haven't found the answer. > > Given a list like: > w = [1, 2, 3, 1, 2, 4, 4, 5, 6, 1] > I would like to be able to do the following as a dict comprehension. > a = {} > for x in w: > a[x] = a.get(x,0) + 1 > results in a having the value: > {1: 3, 2: 2, 3: 1, 4: 2, 5: 1, 6: 1} > > I've tried a few things > eg > a1 = {x:self.get(x,0)+1 for x in w} > results in error messages. > > And > a2 = {x:a2.get(x,0)+1 for x in w} > also results in error messages. > > Trying to set a variable to a dict before doing the comprehension > a3 = {} > a3 = {x:a3.get(x,0)+1 for x in w} > gets this result, which isn't what I wanted. > {1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1} > > I'm not sure that it's possible to do this, and if not, perhaps the > most obvious question is what instance does the get method bind to?
The name a3 will not be rebound until after the right side is evaluate. To spell it with a loop: a3 = {} _internal = {} # You have no access to this var. # Even if you can beat a particular # Python implementation -- you shouldn't for x in w: _internal[x] = a3.get(x, 0) + 1 a3 = _internal That should make it clear that x will be looked up in the "old" empty a3 dict. The closest you can get to a self-updating dict is probably >>> w = [1, 2, 3, 1, 2, 4, 4, 5, 6, 1] >>> a1 = {} >>> a1.update((x, a1.get(x, 0)+1) for x in w) >>> a1 {1: 3, 2: 2, 3: 1, 4: 2, 5: 1, 6: 1} but that it works doesn't mean it is a good idea. If your Python version supports it the obvious choice is >>> from collections import Counter >>> w = [1, 2, 3, 1, 2, 4, 4, 5, 6, 1] >>> Counter(w) Counter({1: 3, 2: 2, 4: 2, 3: 1, 5: 1, 6: 1}) -- http://mail.python.org/mailman/listinfo/python-list