|
|
@ -1,6 +1,6 @@ |
|
|
|
#!/usr/bin/ipython -pylab |
|
|
|
#!/usr/bin/ipython -pylab |
|
|
|
# |
|
|
|
# |
|
|
|
# $Id: sugar.py,v 1.4 2010-05-28 18:47:56 wirawan Exp $ |
|
|
|
# $Id: sugar.py,v 1.5 2010-08-12 19:35:55 wirawan Exp $ |
|
|
|
# |
|
|
|
# |
|
|
|
# Created: 20100121 |
|
|
|
# Created: 20100121 |
|
|
|
# Wirawan Purwanto |
|
|
|
# Wirawan Purwanto |
|
|
@ -55,13 +55,59 @@ def dict_slice(Dict, *keys): |
|
|
|
def dict_join(*dicts): |
|
|
|
def dict_join(*dicts): |
|
|
|
"""Join multiple dicts into one, updating duplicate keys from left-to-right |
|
|
|
"""Join multiple dicts into one, updating duplicate keys from left-to-right |
|
|
|
manner. |
|
|
|
manner. |
|
|
|
Thus the key from the rightmost dict will take precedence.""" |
|
|
|
Thus the items from the rightmost dict will take precedence.""" |
|
|
|
|
|
|
|
|
|
|
|
rslt = {} |
|
|
|
rslt = {} |
|
|
|
for d in dicts: |
|
|
|
for d in dicts: |
|
|
|
rslt.update(d) |
|
|
|
rslt.update(d) |
|
|
|
return rslt |
|
|
|
return rslt |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def list_join(*L): |
|
|
|
|
|
|
|
r = [] |
|
|
|
|
|
|
|
for i in L: |
|
|
|
|
|
|
|
r += i |
|
|
|
|
|
|
|
return r |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ranges_type: |
|
|
|
|
|
|
|
"""This class is to provide dirty magic to specify piecewice slices |
|
|
|
|
|
|
|
of one-dimensional ranges. |
|
|
|
|
|
|
|
To this end, use the `ranges' instance already defined in this module. |
|
|
|
|
|
|
|
Example: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>>> ranges[1] |
|
|
|
|
|
|
|
[1] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>>> ranges[1, 4, 7, 9] |
|
|
|
|
|
|
|
[1] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>>> ranges[1:7, 9:11] |
|
|
|
|
|
|
|
[1, 2, 3, 4, 5, 6, 9, 10] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>>> rr[1,4,7,9,[2,3,2]] # it even works like this! |
|
|
|
|
|
|
|
[1, 4, 7, 9, 2, 3, 2] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The key is, anything 1-D will be flattened out. So be careful. |
|
|
|
|
|
|
|
Slices must have defined starting and ending points. |
|
|
|
|
|
|
|
Undefined step will be reinterpreted as unit step. |
|
|
|
|
|
|
|
As always: endpoints are not included when using the slicing syntax. |
|
|
|
|
|
|
|
""" |
|
|
|
|
|
|
|
def expand_range(self, rr): |
|
|
|
|
|
|
|
pass |
|
|
|
|
|
|
|
def __getitem__(self, rr): |
|
|
|
|
|
|
|
if "__iter__" in dir(rr): |
|
|
|
|
|
|
|
return list_join(*[ self[r] for r in rr ]) |
|
|
|
|
|
|
|
elif isinstance(rr, slice): |
|
|
|
|
|
|
|
if rr.step == None: |
|
|
|
|
|
|
|
step = 1 |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
step = rr.step |
|
|
|
|
|
|
|
return range(rr.start, rr.stop, step) |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
return [rr] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ranges = ranges_type() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Parameters(object): |
|
|
|
class Parameters(object): |
|
|
|
"""A standardized way to define and/or pass parameters (with possible |
|
|
|
"""A standardized way to define and/or pass parameters (with possible |
|
|
|