40 lines
1.5 KiB
Python
40 lines
1.5 KiB
Python
from collections import namedtuple
|
|
from pprint import pprint as pp
|
|
from math import floor
|
|
|
|
Stem = namedtuple('Stem', 'data, leafdigits')
|
|
|
|
data0 = Stem((12, 127, 28, 42, 39, 113, 42, 18, 44, 118, 44, 37, 113, 124, 37,
|
|
48, 127, 36, 29, 31, 125, 139, 131, 115, 105, 132, 104, 123, 35,
|
|
113, 122, 42, 117, 119, 58, 109, 23, 105, 63, 27, 44, 105, 99,
|
|
41, 128, 121, 116, 125, 32, 61, 37, 127, 29, 113, 121, 58, 114,
|
|
126, 53, 114, 96, 25, 109, 7, 31, 141, 46, 13, 27, 43, 117, 116,
|
|
27, 7, 68, 40, 31, 115, 124, 42, 128, 52, 71, 118, 117, 38, 27,
|
|
106, 33, 117, 116, 111, 40, 119, 47, 105, 57, 122, 109, 124, 115,
|
|
43, 120, 43, 27, 27, 18, 28, 48, 125, 107, 114, 34, 133, 45, 120,
|
|
30, 127, 31, 116, 146),
|
|
1.0)
|
|
|
|
def stemplot(stem):
|
|
d = []
|
|
interval = int(10**int(stem.leafdigits))
|
|
for data in sorted(stem.data):
|
|
data = int(floor(data))
|
|
stm, lf = divmod(data,interval)
|
|
d.append( (int(stm), int(lf)) )
|
|
stems, leafs = list(zip(*d))
|
|
stemwidth = max(len(str(x)) for x in stems)
|
|
leafwidth = max(len(str(x)) for x in leafs)
|
|
laststem, out = min(stems) - 1, []
|
|
for s,l in d:
|
|
while laststem < s:
|
|
laststem += 1
|
|
out.append('\n%*i |' % ( stemwidth, laststem))
|
|
out.append(' %0*i' % (leafwidth, l))
|
|
out.append('\n\nKey:\n Stem multiplier: %i\n X | Y => %i*X+Y\n'
|
|
% (interval, interval))
|
|
return ''.join(out)
|
|
|
|
if __name__ == '__main__':
|
|
print( stemplot(data0) )
|