simple way to un-nest (flatten?) list

djc anrnsrisnotreqid at blueyonder.co.uk
Tue Nov 7 19:22:03 EST 2006


bearophileHUGS at lycos.com wrote:
> It is simple, but I suggest you to take a look at the speed of that
> part of your code into your program. With this you can see the
> difference:
> 
> from time import clock
> d = dict((i,range(300)) for i in xrange(300))
> 
> t = clock()
> r1 = sum(d.values(), [])
> print clock() - t
> 
> t = clock()
> r2 = []
> for v in d.values(): r2.extend(v)
> print clock() - t

Yes, interesting, and well worth noting

1   for v in d.values(): r1.extend(v)

2   from itertools import chain
     set(chain(*d.itervalues()))

3   set(v for t in d.values() for v in t)

4   sum(d.values(), [])

5   reduce((lambda l,v: l+v), d.values())

  on IBM R60e [CoreDuo 1.6MHz/2GB]
  d = dict((i,range(x)) for i in xrange(x))
  x 	t1	t2 	t3 	  t4 	  t5
300 	0.0  	0.02  	0.04  	  0.31    0.32
500 	0.01 	0.09 	0.1 	  1.67 	  1.69
1000 	0.02 	0.3 	0.4 	 16.17 	 16.15
	0.03 	0.28 	0.42 	 16.37 	 16.31
1500 	0.03 	0.76 	0.94 	 57.05 	 57.13
2000 	0.07 	1.2 	1.66 	136.6 	136.97
2500 	0.11 	2.34 	2.64 	268.44 	268.85

but on the other hand, as the intended application is a small command 
line app where x is unlikely to reach double figures and there are only 
two users, myself included:
d = 
{'a':['ASLIB','Aslib'],'j':['JDOC','jdoc'],'x':['test','alt','3rd'],'y':['single',]}
	0.0 	0.0 	0.0 	0.0 	0.0

And sum(d.values(), []) has the advantage of raising a TypeError in the 
case of a possible mangled input.

{'a':['ASLIB','Aslib'],'j':['JDOC','jdoc'],'x':['test','alt','3rd'],'y':'single'}
  r1
['ASLIB', 'Aslib', 'test', 'alt', '3rd', 'JDOC', 'jdoc', 's', 'i', 'n', 
'g', 'l', 'e']
r2
set(['Aslib', 'JDOC', 'g', '3rd', 'i', 'l', 'n', 'ASLIB', 's', 'test', 
'jdoc', 'alt', 'e'])
r4 = sum(d.values(), [])
TypeError: can only concatenate list (not "str") to list



-- 
djc



More information about the Python-list mailing list