| Line | |
|---|
| 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()
|
|---|
Note:
See
TracBrowser
for help on using the repository browser.