using zip() and dictionaries

Sneaky Wombat joe.hrbek at gmail.com
Thu Apr 30 20:23:59 CEST 2009


Thanks!  That certainly explains it.  This works as expected.

columnMap={}
for (k,v) in zip(header,[[] for i in range(len(header))]):
    #print "%s,%s"%(k,v)
    columnMap[k] = v

columnMap['a'].append('test')


(sorry about the double post, accidental browser refresh)

On Apr 30, 1:09 pm, Chris Rebert <c... at rebertia.com> wrote:
> > On Apr 30, 12:45 pm, Sneaky Wombat <> wrote:
> >> I'm really confused by what is happening here.  If I use zip(), I
> >> can't update individual dictionary elements like I usually do.  It
> >> updates all of the dictionary elements.  It's hard to explain, so here
> >> is some output from an interactive session:
>
> >> In [52]: header=['a','b','c','d']
> >> In [53]: columnMap={}
> >> In [54]: for (k,v) in zip(header,[[]]*len(header)):
> >>    ....:     #print "%s,%s"%(k,v)
> >>    ....:     columnMap[k] = v
> >>    ....:
> >> In [55]: columnMap
> >> Out[55]: {'a': [], 'b': [], 'c': [], 'd': []}
> >> In [56]: columnMap['a'].append('something')
> >> In [57]: columnMap
> >> Out[57]:
> >> {'a': ['something'],
> >>  'b': ['something'],
> >>  'c': ['something'],
> >>  'd': ['something']}
>
> >> Why does ['something'] get attached to all columnMap elements instead
> >> of just element 'a'?
>
> >> In [58]: columnMap={'a': [], 'b': [], 'c': [], 'd': []}
> >> In [59]: columnMap['a'].append('something')
> >> In [60]: columnMap
> >> Out[60]: {'a': ['something'], 'b': [], 'c': [], 'd': []}
>
> >> creating the dictionary without using zip, it works as normal.
> On Thu, Apr 30, 2009 at 11:00 AM, Sneaky Wombat <joe.hr... at gmail.com> wrote:
> > quick update,
>
> > #change this line:
> > for (k,v) in zip(header,[[]]*len(header)):
> > #to this line:
> > for (k,v) in zip(header,[[],[],[],[]]):
>
> > and it works as expected.  Something about the [[]]*len(header) is
> > causing the weird behavior.  I'm probably using it wrong, but if
> > anyone can explain why that would happen, i'd appreciate it.  My guess
> > is that it's iterating through the the whole dictionary because of the
> > value on the right in zip().
>
> Readhttp://www.python.org/doc/faq/programming/#how-do-i-create-a-multidim...
> Basically, the multiplication doesn't create new sub-lists, it just
> copies references to the one original empty sublist.
>
> Cheers,
> Chris
> --http://blog.rebertia.com




More information about the Python-list mailing list