problem of converting a list to dict

bsneddon bsneddon at yahoo.com
Wed Jan 9 21:28:39 CET 2008


On Jan 9, 3:12 pm, Tim Chase <python.l... at tim.thechases.com> wrote:
> > mylist=['','tom=boss','mike=manager','paul=employee','meaningless']
>
> > I'd like to remove the first and the last item as they are irrevalent,
> > and convert it to the dict:
> > {'tom':'boss','mike':'manager','paul':'employee'}
>
> > I tried this but it didn't work:
>
> > mydict={}
> > for i in mylist[1:-1]:
> >    a=i.split('=')          # this will disect each item of mylist into a 2-item
> > list
> >    mydict[a[0]]=a[1]
>
> > and I got this:
> >   File "srch", line 19, in <module>
> >     grab("a/tags1")
> >   File "srch", line 15, in grab
> >     mydict[mylist[0]]=mylist[1]
> > IndexError: list index out of range
>
> This can be rewritten a little more safely like
>
>    mydict = dict(pair.split('=',1)
>      for pair in mylist
>      if '=' in pair)
>
> Some of John Machin's caveats still apply:
> (2) a[0] is empty or not what you expect (a person's name)
> (3) a[1] is empty or not what you expect (a job title)
> (consider what happens with 'tom = boss' ... a[0] = 'tom ', a[1] = '
> boss')
> (4) duplicate keys [...., 'tom=boss', 'tom=clerk', ...]
>
> to which I'd add
>
> (5) what happens if you have more than one equals-sign in your
> item?  ("bob=robert=manager" or "bob=manager=big-cheese")
>
> #2 and #3 can be ameliorated a bit by
>
>    import string
>    mydict = dict(
>      map(string.strip,pair.split('=',1))
>      for pair in mylist
>      if '=' in pair)
>
> which at least whacks whitespace off either end of your keys and
> values.  #4 and #5 require a clearer definition of the problem.
>
> -tkc

This seemed to work for me if you are using 2.4 or greater and
like list comprehension.
>>> dict([ tuple(a.split("=")) for a in mylist[1:-1]])
{'mike': 'manager', 'paul': 'employee', 'tom': 'boss'}

should be faster than looping



More information about the Python-list mailing list