TI:WTBD/Ćwiczenia 6
Transkrypt
TI:WTBD/Ćwiczenia 6
TI:WTBD/Ćwiczenia 6 Zadanie -- ,,kartkówka": napisać program, który posortuje linie strumienia tekstowego według ich długości, liczonej w znakach (unikodowych) z pominięciem ew. znaków pustych na początku i końcu linii; kodowanie może być podane jako argument opcji wywołania -e, domyślnie przyjmujemy UTF-8; linie o tej samej długości sortuje w porządku ,,leksykograficznym". Przykład rozwiązania: #! /usr/bin/python # coding: utf-8 from fileinput import input from optparse import OptionParser parser = OptionParser() parser.add_option('-e', '--encoding', dest='encoding', default='utf-8') opts, args = parser.parse_args() enc = opts.encoding def keyfun(line): s = line.decode(enc).strip() return len(s), s lines = sorted(input(args), key=keyfun) for l in lines: print l, Funkcja keyfun, wyznaczająca klucz sortowania, zwraca dwuelementową krotkę (tuple) składającą się z długości linii, i samej treści linii (po przekształceniu na napis unikodowy i oczyszczeniu ze zbędnych znaków pustych, zgodnie z warunkami zadania). Korzystamy tutaj z faktu, że domyślne sortowanie sekwencji wykorzystuje domyślny porządek kolejnych elementów -- a więc w tym przypadku, będzie oparte w pierwszej kolejności na porządku długości linii (numerycznym), a w drugiej -- na porządku leksykograficznym ich (zdekodowanej i oczyszczonej) treści. Uwaga: definicja keyfun może korzystać z wartości zmiennej enc, zawierającej nazwę kodowania, ponieważ jest wpisana w miejscu, w którym wartość tej zmiennej jest już znana. Zupełnie inaczej, niż w językach statycznie kompilowanych! (tam kolejność definicji w pliku źródłowym nie gra roli). Wyrażenia regularne w Pythonie funkcja 're.compile' 'search' -- metoda i funkcja mikro-grep w Pythonie (pygrep.py), do ćwiczenia składni wyrażeń regularnych w jej dialekcie pythonowym import re from fileinput import input from sys import argv rx = re.compile(argv[1].decode('utf-8'), re.UNICODE) for l in input(argv[2:]): if rx.search(l.decode('utf-8')): print l, 'findall' -- metoda i funkcja. Parsowanie tekstu (wyodrębnianie interesujących fragmentów) poprzez wykorzystanie ,,grup wychwytujących".