[Tutor] text processing lines variable content
Peter Otten
__peter__ at web.de
Thu Feb 7 12:06:39 EST 2019
ingo janssen wrote:
>
>
> On 07/02/2019 11:08, Peter Otten wrote:
>> replace the sequence of tests with dictionary lookups
>
> updated the gist a few times, now I could pre calculate the slices to be
> taken per line, but will there be much gain compared to the copping from
> the left side of the list?
Sorry, I don't understand the question.
Looking at your code
> if action == "%i":
> lbl = function[action](content[action])
you really do not need the function[action] lookup here because you know
that the result will always be f_number. Likewise you could bind
content["%i"] to a name, labels, say, and then write
if action == "%s":
lbl = f_number(labels)
which I find much more readable.
A lookup table only makes sense if provides all necessary information. I
tried to apply the idea to one of your gist versions:
def set_lbl(items):
global lbl
lbl = f_number(items)
def set_w(items):
global v
v = f_number(items)
def set_f(items):
global f
f = f_number(items)
def set_mx(items):
global mx
mx = mx_value_array(items, f)
function = {
"%i" : set_lbl,
"%w" : set_w,
"%s" : set_f,
"%a" : set_mx,
"%q" : f_vector,
"%r" : f_value,
"%p" : lambda items: f_vector_array(items, v),
"%P" : lambda items: f_vector_array(items, v),
"%o" : lambda items: f_value_array(items, v),
"%m" : f_value,
"%g" : f_number,
"%E" : f_value,
"%e" : lambda items: f_value_array(items, f),
"%F" : f_value,
"%A" : lambda items: f_value_array(items, mx + 1),
"%f" : lambda items: f_value_array(items, f),
"%t" : lambda items: f_nested_value_array(items, f),
"%l" : lambda items: f_vector_array(items, f),
"%n" : lambda items: f_value_array(items, f),
"%v" : f_value,
"%c" : f_vector,
"%C" : f_vector
}
order = "%i %q %r %w %p %P %o %m %g %E %s %e %F %a %A %f %t %l %n %v %c %C"
order = re.findall("%[a-z]",order,re.M|re.I)
content = {}
actions = []
for i in order:
items = content[i] = []
actions.append(partial(function[i], items))
for points, line in enumerate(open("vorodat.txt.vol",'r'), 1):
line = line.strip()
line = line.split(" ")
for action in actions:
action()
However, while the loop is rather clean now the rest of the code is
sprinkled with implicit arguments and thus much worse than what you have.
More information about the Tutor
mailing list