a clean way to define dictionary

Oren Tirosh oren-py-l at hishome.net
Thu Jun 19 12:20:48 CEST 2003


On Thu, Jun 19, 2003 at 09:16:17AM +0000, Kendear wrote:
> I'd prefer not to rely on the newline
> separating each key value pair or any limitation
> of the white spaces...  so i tried
> the following and they seem to work fine...
> 
> >>> lst = """
> a    1            b     1000
> foo  3            foo2  2000
> bar  234          bar2  1200
> joe  321          cool  2
> """
> 
> >>> lst = lst.split()
> 
> >>> dict([(lst[i], eval(lst[i+1])) for i in range(0, len(lst), 2)])
> {'a': 1, 'bar2': 1200, 'bar': 234, 'foo': 3, 'cool': 2, 'b': 1000, 'foo2': 
> 2000, 'joe': 321}
> 
> >>> dict([(lst.pop(0), eval(lst.pop(0))) for i in range(0, len(lst), 2)])
> {'a': 1, 'bar2': 1200, 'bar': 234, 'foo': 3, 'cool': 2, 'b': 1000, 'foo2': 
> 2000, 'joe': 321}
> 
> # or the above can be
> >>> dict([(lst.pop(0), eval(lst.pop(0))) for i in range(len(lst)/2)])
> {'a': 1, 'bar2': 1200, 'bar': 234, 'foo': 3, 'cool': 2, 'b': 1000, 'foo2': 
> 2000, 'joe': 321}

This version does the splitting into pairs in one step:

>>> dict([m.groups() for m in re.finditer(r'(\S+)\s+(\S+)', lst)])
{'a': '1', 'bar2': '1200', 'bar': '234', 'foo': '3', 'cool': '2', 'b':
'1000', 'foo2': '2000', 'joe': '321'}


This one does not create any temporary lists - pairs are streamed from 
finditer through the generator function straight into the dictionary:

>>> def genpairs(s):
...    for m in re.finditer(r'(\S+)\s+(\S+)', s):
...        yield m.groups()
...
>>> dict(genpairs(lst))
{'a': '1', 'bar2': '1200', 'bar': '234', 'foo': '3', 'cool': '2', 'b':
'1000', 'foo2': '2000', 'joe': '321'}


"There should be one-- and preferably only one --obvious way to do it."

;-)

    Oren






More information about the Python-list mailing list