diff options
-rwxr-xr-x | src/median | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/median b/src/median new file mode 100755 index 0000000..43a8820 --- /dev/null +++ b/src/median @@ -0,0 +1,50 @@ +#!/usr/bin/env python3 +# -*- python -*- +''' +median — Calculate the median value for a set of groups +Copyright © 2014 Mattias Andrée (maandree@member.fsf.org) + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. +''' + +lines = [] +try: + while True: + lines.append(input()) +except: + pass + +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.sort(key = lambda x : x[1]); + +last, values = None, None +lines.append((..., ...)) +for value, key in lines: + if last != key: + if last is not None: + values.sort(key = lambda x : int(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) + last, values = key, [] + values.append(value) + |