Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

python: iterating through a dictionary with list values

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 
like image 393
foosion Avatar asked Aug 17 '13 14:08

foosion


1 Answers

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} 
like image 179
Brionius Avatar answered Sep 23 '22 22:09

Brionius