|
1 #! /usr/bin/env python |
|
2 |
|
3 # 2) Sorting Test |
|
4 # |
|
5 # Sort an input file that consists of lines like this |
|
6 # |
|
7 # var1=23 other=14 ditto=23 fred=2 |
|
8 # |
|
9 # such that each output line is sorted WRT to the number. Order |
|
10 # of output lines does not change. Resolve collisions using the |
|
11 # variable name. e.g. |
|
12 # |
|
13 # fred=2 other=14 ditto=23 var1=23 |
|
14 # |
|
15 # Lines may be up to several kilobytes in length and contain |
|
16 # zillions of variables. |
|
17 |
|
18 # This implementation: |
|
19 # - Reads stdin, writes stdout |
|
20 # - Uses any amount of whitespace to separate fields |
|
21 # - Allows signed numbers |
|
22 # - Treats illegally formatted fields as field=0 |
|
23 # - Outputs the sorted fields with exactly one space between them |
|
24 # - Handles blank input lines correctly |
|
25 |
|
26 import re |
|
27 import string |
|
28 import sys |
|
29 |
|
30 def main(): |
|
31 prog = re.compile('^(.*)=([-+]?[0-9]+)') |
|
32 def makekey(item, prog=prog): |
|
33 match = prog.match(item) |
|
34 if match: |
|
35 var, num = match.group(1, 2) |
|
36 return string.atoi(num), var |
|
37 else: |
|
38 # Bad input -- pretend it's a var with value 0 |
|
39 return 0, item |
|
40 while 1: |
|
41 line = sys.stdin.readline() |
|
42 if not line: |
|
43 break |
|
44 items = line.split() |
|
45 items = map(makekey, items) |
|
46 items.sort() |
|
47 for num, var in items: |
|
48 print "%s=%s" % (var, num), |
|
49 print |
|
50 |
|
51 main() |