aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2014-11-06 04:59:18 +0100
committerMattias Andrée <maandree@operamail.com>2014-11-06 04:59:18 +0100
commit712a165dceffe51c700d5fec51dfee22dee3c101 (patch)
tree6885389c05eec8c76714e36f61973148dcc1abcb
parentm (diff)
downloadmedian-712a165dceffe51c700d5fec51dfee22dee3c101.tar.gz
median-712a165dceffe51c700d5fec51dfee22dee3c101.tar.bz2
median-712a165dceffe51c700d5fec51dfee22dee3c101.tar.xz
misc
Signed-off-by: Mattias Andrée <maandree@operamail.com>
-rwxr-xr-xsrc/median44
1 files changed, 37 insertions, 7 deletions
diff --git a/src/median b/src/median
index 7d7c39e..e027526 100755
--- a/src/median
+++ b/src/median
@@ -27,7 +27,7 @@ except:
get_key = lambda x : x[x.index(' '):] if ' ' in x else ''
get_value = lambda x : x[:x.index(' ')] if ' ' in x else x
-lines = [(get_value(line), get_key(line)) for line in lines if not line == '']
+lines = [(get_value(line), get_key(line)) for line in lines if not line == '']
lines.sort(key = lambda x : x[1]);
@@ -36,15 +36,45 @@ lines.append((..., ...))
for value, key in lines:
if last != key:
if last is not None:
- values.sort(key = lambda x : int(x))
+ values.sort(key = lambda x : float(x))
if len(values) % 2 == 1:
median = values[len(values) // 2]
else:
- low = values[len(values) // 2 + 0]
- high = values[len(values) // 2 + 1]
- median = (int(low) + int(high)) // 2
- median = '%%0%ii' % len(high) % median
- print(median + last)
+ low = values[len(values) // 2 - 1]
+ high = values[len(values) // 2 - 0]
+ low_plus, low_minus, low_dot = (low[0] == '+'), (low[0] == '-'), ('.' in low)
+ high_plus, high_minus, high_dot = (high[0] == '+'), (high[0] == '-'), ('.' in high)
+ if low_plus or low_minus: low = low[1:]
+ if high_plus or high_minus: high = high[1:]
+ if not low_dot: low += '.'
+ if not high_dot: high += '.'
+ lowi , lowd = [len(x) for x in low.split('.')]
+ highi, highd = [len(x) for x in high.split('.')]
+ if lowd < highd: low += '0'
+ if lowd > highd: high += '0'
+ mediani = max(lowi, highi)
+ mediand = max(lowd, highd)
+ median = float(low) * (-1 if low_minus else 1)
+ median += float(high) * (-1 if high_minus else 1)
+ negative, median = median < 0, abs(median) / 2
+ if (int(low.replace('.', '')[-1]) + int(high.replace('.', '')[-1])) % 2 == 1:
+ mediand += 1
+ if mediand == 0:
+ median = '%%0%ii' % mediani % median
+ if low_dot or high_dot:
+ median += '.'
+ else:
+ median = '%%0%i.%if' % (max(1, mediani) + mediand + 1, mediand) % median
+ if mediani == 0:
+ median = median[1:]
+ if low_minus and high_minus: prefix = '-'
+ elif negative: prefix = '-'
+ elif low_plus or high_plus: prefix = '+'
+ elif low_minus or high_minus: prefix = '0'
+ else: prefix = ''
+ median = prefix + median
+ if median != last.split(' ')[2]:
+ print(median + last)
last, values = key, []
values.append(value)