Add subdirectories
Add /ipynb/ and /py/ subdirectories to keep the home page neater.
This commit is contained in:
73
py/testaccum.py
Normal file
73
py/testaccum.py
Normal file
@@ -0,0 +1,73 @@
|
||||
from __future__ import division
|
||||
import re
|
||||
from accum import *
|
||||
|
||||
|
||||
acc_re = re.compile("[[](.+):(.+) for (.+) in (.+)[]]")
|
||||
|
||||
def expand_accumulations(program_text):
|
||||
"""Replace any accumulation displays in program_text with calls to
|
||||
accumulation. Used to simulate a hypothetical Python interpreter that
|
||||
actually handles accumlation displays. This one is rather poor: it
|
||||
won't match across lines, it won't match nested accumulation displays,
|
||||
and it doesn't handle multiple 'for' clauses; nor 'if' clauses."""
|
||||
def _(matchobj):
|
||||
(acc, exp, x, it) = matchobj.groups()
|
||||
return "accumulation(%s, lambda %s: (%s), %s)" % (acc, x, exp, it)
|
||||
return acc_re.sub(_, program_text)
|
||||
|
||||
def test1(acc_display, expected):
|
||||
"Eval an accumulation display and see if it gets the expected answer."
|
||||
print acc_display
|
||||
result = eval(expand_accumulations(acc_display))
|
||||
assert result == expected, ('Got %s; expected %s' % (result, expected))
|
||||
print ' ==> %s' % result
|
||||
|
||||
#### Initialize some data
|
||||
temp = [70, 70, 71, 74, 76, 76, 72, 76, 77, 77, 77, 78,
|
||||
78, 79, 79, 79, 78, 80, 82, 83, 83, 81, 84, 83]
|
||||
data = temp
|
||||
def f(x): return 2 * x
|
||||
votes = {'Arnie': 48, 'Gray': 45, 'Tom': 13, 'Cruz': 32, 'Peter': 3}
|
||||
candidates = votes.keys()
|
||||
|
||||
def test():
|
||||
|
||||
print 'temp = ', temp
|
||||
print 'data = temp'
|
||||
print 'votes = ', votes
|
||||
print 'candidates = ', candidates
|
||||
print
|
||||
|
||||
#### Test some accumulation displays
|
||||
test1("[Max: temp[hour] for hour in range(24)]",
|
||||
max([temp[hour] for hour in range(24)]))
|
||||
test1("[Min: temp[hour] for hour in range(24)]",
|
||||
min([temp[hour] for hour in range(24)]))
|
||||
test1("[Sum: x*x for x in data]",
|
||||
sum([x*x for x in data]))
|
||||
test1("[Mean: f(x) for x in data]",
|
||||
sum([f(x) for x in data])/len(data))
|
||||
test1("[Median: f(x) for x in data]",
|
||||
156.0)
|
||||
test1("[Mode: f(x) for x in data]",
|
||||
166)
|
||||
test1("[Argmax: votes[c] for c in candidates]",
|
||||
'Arnie')
|
||||
test1("[Argmin: votes[c] for c in candidates]",
|
||||
'Peter')
|
||||
test1("[Some: temp[hour] > 75 for hour in range(24)]",
|
||||
len([hour for four in range(24) if temp[hour] > 75])>0)
|
||||
test1("[Every: temp[hour] > 75 for hour in range(24)]",
|
||||
len([h for h in range(24) if temp[h] > 75]) == 24)
|
||||
test1("[Top(10): temp[hour] for hour in range(24)]",
|
||||
[84, 83, 83, 83, 82, 81, 80, 79, 79, 79])
|
||||
test1("[Join(', '): votes[c] for c in candidates]",
|
||||
', '.join([str(votes[c]) for c in candidates]))
|
||||
test1("[SortBy: abs(x) for x in (-2, -4, 3, 1)]",
|
||||
[1, -2, 3, -4])
|
||||
test1("[SortBy(reverse=True): abs(x) for x in (-2, -4, 3, 1)]",
|
||||
[-4, 3, -2, 1])
|
||||
|
||||
if __name__ == "__main__":
|
||||
test()
|
||||
Reference in New Issue
Block a user