/Cw10

Z Brain-wiki

TI:WTBD/Ćwiczenia 10

Sprawdzian 1

Zadania dla gr. 1

  1. Ustalić ile w Plik:PanTadeusz1.txt występuje słów zawierających ,,polskie litery", a ile takich, które ich nie zawierają, oraz jaka jest średnia długość słowa w ramach jednej i drugiej klasy (z uwzględnieniem powtarzających się słów).
  2. Korzystając z zawartości pliku /usr/share/dict/words wyodrębnić z niego wszystkie słowa (linijki) składające się wyłącznie z liter (tzn. pominąć te z apostrofami, łącznikami itp.), a wśród nich — znaleźć te, w których występuje najdłuższy ciąg spółgłosek nie oddzielonych samogłoskami. Na użytek tego zadania uznajemy, że samogłoskami w języku angielskim są jedynie 'a', 'e', 'i', 'o', 'u'.
  3. Napisać program, który na podstawie jednego lub więcej plików takich, jak Warszawa.csv wypisze ile w nich występuje różnych kodów pocztowych dla wszystkich pojawiających się w nich zestawów 2 cyfr początkowych, w kolejności malejącej liczby kodów.

przykładowe rozwiązania

Zad. 1

#! /usr/bin/python
# coding: utf-8

import re

pliterki = re.compile(u'[ĄĆĘŁŃÓŚŻŹąćęłńóśżź]').search
odstepy = re.compile(u'[^A-Za-zĄĆĘŁŃÓŚŻŹąćęłńóśżź]+') # w tym znaki przestankowe

def szukaj(tekst):
    slowa = odstepy.split(tekst)
    z_pl, bez_pl = list(), list()
    for s in slowa:
        m = pliterki(s)
        if m:
            z_pl.append(s)
        else:
            bez_pl.append(s)
    return (len(z_pl), float(sum(len(s) for s in z_pl)) / len(z_pl),
            len(bez_pl), float(sum(len(s) for s in bez_pl)) / len(bez_pl) )


if __name__ == '__main__':
    from sys import argv
    f = open(argv[1])
    tekst = f.read().decode('utf-8')
    f.close()
    print (u'z literami PL: {0} słów; średnia długość: {1}\n'
           u'bez liter PL: {2} słów; średnia długość: {3}'
          ).format(*szukaj(tekst)).encode('utf-8')

Zad. 2

#! /usr/bin/python
# coding: utf-8

import re

litery = re.compile(r'^[A-Za-z]+\n$').match
spolgloski = re.compile(r'(?:[aeiou]|^)'
                        r'([^aeiou]{3,})'
                        r'(?:[aeiou]|$)',
                        re.IGNORECASE).findall

def dlugosci_i_slowa(slowa):
    for s in slowa:
        ciagi = spolgloski(s)
        if ciagi:
            yield max(len(x) for x in ciagi), s

def znajdz_ciagi(linie):
    slowa = (l.strip() for l in linie if litery(l))
    d_i_s = sorted(dlugosci_i_slowa(slowa))
    max_dlugosci = d_i_s[-1][0]
    wynik = list()
    while d_i_s[-1][0] == max_dlugosci:
        wynik.append(d_i_s.pop()[1])
    return max_dlugosci, wynik

if __name__ == '__main__':
    from fileinput import input
    max_dlugosci, wynik = znajdz_ciagi(input())
    print u'Max długości ciągu spółglosek: {}'.format(max_dlugosci).encode('utf-8')
    for s in wynik:
        print s

Zad. 3

#! usr/bin/python
# coding: UTF-8

import fileinput

plik=fileinput.input()

kody={}

for line in plik:
        kod = line.split(';')[0]
        try:
            kody[kod[:2]].add(kod)
        except KeyError:
            kody[kod[:2]] = set((kod,))
kody = dict((k, len(v)) for (k, v) in kody.items())
kody_pokolei = sorted(kody.items(), key=lambda t: t[1], reverse=True)
        
for kod, ile in kody_pokolei:
        print (u'Liczba różnych kodów o poczatku: {0} to: {1}'
               .format(kod, ile)
               .encode('utf-8')
              )

Zadania dla gr. 2

  1. Napisać program, który na podstawie jednego lub więcej plików takich, jak Warszawa.csv wypisze 3 najczęściej w nich występujące (w największej liczbie rekordów) kody pocztowe, oraz ich częstości. W przypadku ,,remisu" wypisze wszystkie kody, które osiągnęły jeden z 3 najwyższych wyników.
  2. Znaleźć 3 najdłuższe (w sensie liczby liter) słowa w Plik:PanTadeusz1.txt. A dokładniej, wszystkie słowa o 3 największych wartościach długości.
  3. Korzystając z zawartości pliku /usr/share/dict/words/ wyodrębnić z niego wszystkie słowa (linijki) składające się wyłącznie z liter (tzn. pominąć te z apostrofami, łącznikami itp.), a wśród nich -- znaleźć te, które składają się z na przemian samogłosek i spółgłosek, a zaczynają się i kończą na samogłoskę. Określić ile procent stanowią one w stosunku do pozycji wyodrębnionych w pierwszym kroku, i wypisać te z nich, które odznaczają się maksymalną długością. Na użytek tego zadania uznajemy, że samogłoskami w języku angielskim są jedynie 'a', 'e', 'i', 'o', 'u'.

przykładowe rozwiązania

Zad.1

#! /usr/bin/python
# coding: utf-8

def main(linie):
    liczniki = dict()
    for l in linie:
        kod = l.split(';')[0]
        try:
            liczniki[kod] += 1
        except KeyError:
            liczniki[kod] = 1
    topowe = sorted(set(liczniki.values()), reverse=True)[:3]
    wynik = list()
    for n in topowe:
        nkrotne = list(kod for kod in liczniki if liczniki[kod] == n)
        wynik.append((n, nkrotne))
    return wynik

if __name__ == '__main__':
    from fileinput import input
    wynik = main(input())
    for n, nkrotne in wynik:
        print '{} razy:'.format(n), ', '.join(nkrotne)

Zad. 2

#! /usr/bin/python
import re
rx1 = re.compile(r'\W+',re.UNICODE)

def longest_words(tekst):
    words = rx1.split(tekst)
    lengths = map(len, words)
    toplengths = sorted(set(lengths), reverse=True)[:3]
    maxwords = set(w for w in words if len(w) in toplengths)
    return sorted(maxwords,key = len, reverse = True)

if __name__ == '__main__':
    tekst = open('PanTadeusz1.txt').read().decode('utf-8')
    for word in longest_words(tekst):
        print word

Zad. 3

#! /usr/bin/python
# coding: utf-8

import re

litery = re.compile(r'^[A-Za-z]+\n$').match
szukane = re.compile(r'^(?:[aeiou][^aeiou])+[aeiou]$', re.IGNORECASE).match

def znajdz(linie):
    slowa = list(l.strip() for l in linie if litery(l))
    znalezione = (szukane(s) for s in slowa)
    szukaneslowa = set(s.group() for s in znalezione if s)
    odsetek = 100. * len(szukaneslowa)/len(slowa)
    return odsetek, sorted(szukaneslowa, key=len)

if __name__ == '__main__':
    from fileinput import input
    odsetek, slowa = znajdz(input())
    maxlen = len(slowa[-1])
    print u'szukane słowa stanowią {} procent.'.format(odsetek).encode('utf-8')
    while len(slowa[-1]) == maxlen:
        print slowa.pop()

dodatki

Plik:Warszawa.csv.txt: tu można pobrać plik Warszawa.csv, musiałem mu dokleić do nazwy końcówkę .txt, bo Mediawiki nie pozwala na pliki z końcówką .csv. Tak czy owak jest to plik z danymi tekstowymi.