/Cw6

Z Brain-wiki

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".