aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2014-11-06 17:06:59 +0100
committerMattias Andrée <maandree@operamail.com>2014-11-06 17:06:59 +0100
commit8b962d03eb866f3c75ef6d9ad0ac30dbebe5ebac (patch)
treea6ed6c22f3b4ffb91bb53d7ad94d4d6f6a8b4d6a
parentbegin info manual (diff)
downloadmedian-8b962d03eb866f3c75ef6d9ad0ac30dbebe5ebac.tar.gz
median-8b962d03eb866f3c75ef6d9ad0ac30dbebe5ebac.tar.bz2
median-8b962d03eb866f3c75ef6d9ad0ac30dbebe5ebac.tar.xz
add support for non-numerical data
Signed-off-by: Mattias Andrée <maandree@operamail.com>
-rwxr-xr-xsrc/median70
1 files changed, 38 insertions, 32 deletions
diff --git a/src/median b/src/median
index 34dcc0d..8684cef 100755
--- a/src/median
+++ b/src/median
@@ -36,43 +36,49 @@ lines.append((..., ...))
for value, key in lines:
if last != key:
if last is not None:
- values.sort(key = lambda x : float(x))
+ try:
+ values.sort(key = lambda x : float(x))
+ except:
+ values.sort()
if len(values) % 2 == 1:
median = values[len(values) // 2]
else:
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
+ try:
+ 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
+ except:
+ median = values[len(values) // 2 - 1]
print(median + last)
last, values = key, []
values.append(value)