aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2014-11-06 01:11:32 +0100
committerMattias Andrée <maandree@operamail.com>2014-11-06 01:11:32 +0100
commita7c4400cdf2ee2e816750593e962eeb7edf0a8ca (patch)
tree22784b6bab6cf9abd0a7aaa1b94841a292990e7e
parentadd copying and license (diff)
downloadmedian-a7c4400cdf2ee2e816750593e962eeb7edf0a8ca.tar.gz
median-a7c4400cdf2ee2e816750593e962eeb7edf0a8ca.tar.bz2
median-a7c4400cdf2ee2e816750593e962eeb7edf0a8ca.tar.xz
code
Signed-off-by: Mattias Andrée <maandree@operamail.com>
-rwxr-xr-xsrc/median50
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)
+