Given a dictionary of lists, such as
d = {'1':[11,12], '2':[21,21]}
Which is more pythonic or otherwise preferable:
for k in d: for x in d[k]: # whatever with k, x
or
for k, dk in d.iteritems(): for x in dk: # whatever with k, x
or is there something else to consider?
EDIT, in case a list might be useful (e.g., standard dicts don't preserve order), this might be appropriate, although it's much slower.
d2 = d.items() for k in d2: for x in d2[1]: # whatever with k, x
Here's a speed test, why not:
import random numEntries = 1000000 d = dict(zip(range(numEntries), [random.sample(range(0, 100), 2) for x in range(numEntries)])) def m1(d): for k in d: for x in d[k]: pass def m2(d): for k, dk in d.iteritems(): for x in dk: pass import cProfile cProfile.run('m1(d)') print cProfile.run('m2(d)') # Ran 3 trials: # m1: 0.205, 0.194, 0.193: average 0.197 s # m2: 0.176, 0.166, 0.173: average 0.172 s # Method 1 takes 15% more time than method 2
cProfile example output:
3 function calls in 0.194 seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.194 0.194 <string>:1(<module>) 1 0.194 0.194 0.194 0.194 stackoverflow.py:7(m1) 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 4 function calls in 0.179 seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.179 0.179 <string>:1(<module>) 1 0.179 0.179 0.179 0.179 stackoverflow.py:12(m2) 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 1 0.000 0.000 0.000 0.000 {method 'iteritems' of 'dict' objects}
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