sortingtest.py 1.34 KB
Newer Older
1
#! /usr/bin/env python
Guido van Rossum's avatar
Guido van Rossum committed
2 3

# 2)  Sorting Test
4
#
Guido van Rossum's avatar
Guido van Rossum committed
5
#     Sort an input file that consists of lines like this
6
#
Guido van Rossum's avatar
Guido van Rossum committed
7
#         var1=23 other=14 ditto=23 fred=2
8
#
Guido van Rossum's avatar
Guido van Rossum committed
9 10 11
#     such that each output line is sorted WRT to the number.  Order
#     of output lines does not change.  Resolve collisions using the
#     variable name.   e.g.
12 13 14
#
#         fred=2 other=14 ditto=23 var1=23
#
Guido van Rossum's avatar
Guido van Rossum committed
15 16 17 18 19 20 21 22 23 24 25
#     Lines may be up to several kilobytes in length and contain
#     zillions of variables.

# This implementation:
# - Reads stdin, writes stdout
# - Uses any amount of whitespace to separate fields
# - Allows signed numbers
# - Treats illegally formatted fields as field=0
# - Outputs the sorted fields with exactly one space between them
# - Handles blank input lines correctly

26
import re
Guido van Rossum's avatar
Guido van Rossum committed
27 28 29 30
import string
import sys

def main():
31
    prog = re.compile('^(.*)=([-+]?[0-9]+)')
32
    def makekey(item, prog=prog):
33 34 35
        match = prog.match(item)
        if match:
            var, num = match.group(1, 2)
36 37 38 39 40 41 42 43
            return string.atoi(num), var
        else:
            # Bad input -- pretend it's a var with value 0
            return 0, item
    while 1:
        line = sys.stdin.readline()
        if not line:
            break
44
        items = line.split()
45 46 47 48 49
        items = map(makekey, items)
        items.sort()
        for num, var in items:
            print "%s=%s" % (var, num),
        print
Guido van Rossum's avatar
Guido van Rossum committed
50 51

main()