diff options
author | Mattias Andrée <maandree@operamail.com> | 2014-11-06 04:59:18 +0100 |
---|---|---|
committer | Mattias Andrée <maandree@operamail.com> | 2014-11-06 04:59:18 +0100 |
commit | 712a165dceffe51c700d5fec51dfee22dee3c101 (patch) | |
tree | 6885389c05eec8c76714e36f61973148dcc1abcb | |
parent | m (diff) | |
download | median-712a165dceffe51c700d5fec51dfee22dee3c101.tar.gz median-712a165dceffe51c700d5fec51dfee22dee3c101.tar.bz2 median-712a165dceffe51c700d5fec51dfee22dee3c101.tar.xz |
misc
Signed-off-by: Mattias Andrée <maandree@operamail.com>
-rwxr-xr-x | src/median | 44 |
1 files changed, 37 insertions, 7 deletions
@@ -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) |