/Cw10
Z Brain-wiki
Spis treści
TI:WTBD/Ćwiczenia 10
Sprawdzian 1
Zadania dla gr. 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).
- 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'.
- 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
- 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.
- 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.
- 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.