Multiplying all the values in a dictionary

J

John McMonagle

Say I have a dictionary like below:

d = {(100,500):[5,5], (100,501):[6,6], (100,502):[7,7]}

Say I want to multiply all the values of the dictionary by 2:

for key in d.keys():
d[key] = map(lambda x: x*2, d.get(key))

Is there a better/faster/cleaner way to achieve this ?

Thanks,

John
 
S

Scott David Daniels

John said:
Say I have a dictionary like below:

d = {(100,500):[5,5], (100,501):[6,6], (100,502):[7,7]}

Say I want to multiply all the values of the dictionary by 2:
for key in d.keys():
d[key] = map(lambda x: x*2, d.get(key))
Is there a better/faster/cleaner way to achieve this ?

To update, I'd either go with that or Felipe's list comprehension.
If you just want the value of the result, how about:

doubled = dict((key, [x * 2 for x in values])
for key, values in d.iteritems())
 
F

Felipe Almeida Lessa

Em Qui, 2006-03-23 às 17:54 -0800, Scott David Daniels escreveu:
John said:
Say I have a dictionary like below:

d = {(100,500):[5,5], (100,501):[6,6], (100,502):[7,7]}

Say I want to multiply all the values of the dictionary by 2:
for key in d.keys():
d[key] = map(lambda x: x*2, d.get(key))
Is there a better/faster/cleaner way to achieve this ?

To update, I'd either go with that or Felipe's list comprehension.
If you just want the value of the result, how about:

doubled = dict((key, [x * 2 for x in values])
for key, values in d.iteritems())

And always benchmark:

$ python2.4 -mtimeit -s 'd = {(100,500):[5,5], (100,501):[6,6],
(100,502):[7,7]}; x = dict(d)' 'for key in d.keys(): x[key] = map(lambda
x: x*2, d.get(key))'
100000 loops, best of 3: 8.48 usec per loop

$ python2.4 -mtimeit -s 'd = {(100,500):[5,5], (100,501):[6,6],
(100,502):[7,7]}; x = dict(d)' 'for key in d: x[key] = [y*2 for y in
d[key]]' 100000 loops, best of 3: 3.92 usec per loop

You get a large improvement here because:
- lambdas are slow compared to direct operations:
$ python2.4 -mtimeit -s 'a = lambda x: x*2' 'a(1)'
1000000 loops, best of 3: 0.411 usec per loop
$ python2.4 -mtimeit -s 'def a(x): return x*2' 'a(1)'
1000000 loops, best of 3: 0.41 usec per loop
$ python2.4 -mtimeit '1*2'
10000000 loops, best of 3: 0.16 usec per loop
- d.get(x) is slower than d[x]:
$ python2.4 -mtimeit -s 'd = {1:1}' 'd[1]'
10000000 loops, best of 3: 0.172 usec per loop
$ python2.4 -mtimeit -s 'd = {1:1}' 'd.get(1)'
1000000 loops, best of 3: 0.363 usec per loop
- "for key in d:" is faster than "for key in d.keys():":
$ python2.4 -mtimeit -s 'd = {1:1}' 'for k in d: pass'
1000000 loops, best of 3: 0.345 usec per loop
$ python2.4 -mtimeit -s 'd = {1:1}' 'for k in d.keys(): pass'
1000000 loops, best of 3: 0.69 usec per loop



$ python2.4 -mtimeit -s 'd = {(100,500):[5,5], (100,501):[6,6],
(100,502):[7,7]}; x = dict(d)' 'dict((key, [x * 2 for x in values]) for
key, values in d.iteritems())'
100000 loops, best of 3: 7.72 usec per loop

Here it's slower because it creates another dictionary. But it's a
different result, can't be compared directly.

HTH,
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,904
Latest member
HealthyVisionsCBDPrice

Latest Threads

Top