Best way to convert a list to a dictionary

Peter Schneider-Kamp petersc at stud.ntnu.no
Thu May 4 02:22:03 EDT 2000


Michael Husmann wrote:
> 
> d = {}
> for k, v in your_list:
>     d[k] = v
> 
> This example looks nice bus does not work with my Python 1.52. Trying to
> get both elements from 'your_list' produces a TypeError exception:

Thats rather strange. I used exactly that code to benchmark it against
a reduce-based solution. It works flawlessly on my 1.5.2. Here is the
code:

import time # for the timing

# helper functions assuming dict is the
# dictionary to use
def dodictreduce(a,b):
  dict[a[0]]=a[1]
  return b
def dodictmap(a):
  dict[a[0]]=a[1]

# list initialization
list=[]
for i in range(100000):
  list.append([i,i+1])

# reduce version
t = time.time()
dict={}
k,v = reduce(dodictreduce,list)
dict[k] = v
t = time.time() - t
print t

# map version
t = time.time()
dict = {}
map(dodictmap,list)
t = time.time() - t
print t

# for-loop version
t = time.time()
dict = {}
for key, value in list:
    dict[key] = value
t = time.time() - t
print t

# yet-another-for-loop version
t = time.time()
dict = {}
for a in list:
    dict[a[0]] = a[1]
t = time.time() - t
print t

By the way: The direct for-loop version proposed 
is asymptotically about 5% faster than the reduce
version and about 15% faster than the map version
on my machine. It performs just very slightly
faster than the other for loop.
So as far as I can see the direct for-loop is the
thing to go after.

Bye
Peter
--
Peter Schneider-Kamp          ++47-7388-7331
Herman Krags veg 51-11        mailto:peter at schneider-kamp.de
N-7050 Trondheim              http://schneider-kamp.de




More information about the Python-list mailing list