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>
Diffstat (limited to '')
| -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) | 
