dict comprehension question.

Mitya Sirenef msirenef at lightbird.net
Sat Dec 29 15:09:57 EST 2012


On 12/29/2012 03:01 PM, Mitya Sirenef wrote:
> On 12/29/2012 02:48 PM, 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?
 >>
 >> TIA
 >
 > Will this do?:
 >
 > >>> w = [1, 2, 3, 1, 2, 4, 4, 5, 6, 1]
 > >>> {x: w.count(x) for x in w}
 > {1: 3, 2: 2, 3: 1, 4: 2, 5: 1, 6: 1}
 >
 >
 > - mitya
 >

I should probably add that this might be inefficient for large lists as
it repeats count for each item. If you need it for large lists, profile
against the 'for loop' version and decide if performance is good enough
for you, for small lists it's a nice and compact solution.

In a more general case, you can't refer to the list/dict/etc
comprehension as it's being constructed, that's just not a design goal
of comprehensions.

  -m

-- 
Lark's Tongue Guide to Python: http://lightbird.net/larks/




More information about the Python-list mailing list