Продолжаем решать задачки с http://www.pythonchallenge.com . Третье задание выглядит так:
«Распознайте символы. Может быть они в книге, а МОЖЕТ в исходном коде страницы».
Явная подсказка, что текст для расшифровки находится коде страницы, открываем его и видим закомментированный участок с описанием того что именно нужно сделать «find rare characters in the mess below:» — найди самые редкие символы в тексте ниже…и ниже идёт текст.
Моё решение прямо в лоб:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | from urllib.request import urlopen # скачиваем страницу page = urlopen('http://www.pythonchallenge.com/pc/def/ocr.html') contents = page.read().decode() # выделяем из html зашифрованный код s = contents.split('<!--')[2].split('-->')[0] words = {} for i in s: # заполняем словарь методом get # ключ - символ из зашиврованного текста # значение - количество вхождений символа # используется метод get, который инициализирует значение нулём, если это первое вхождение words[i] = words.get(i, 0) + 1 # преобразуем словарь в список кортежей (символ, количество вхождений) l = list(words.items()) # сортируем по количеству вхождений l.sort(key = lambda i : i[1]) m = l[1][1] # первый элемент - это минимальное значение # отбираем все значения равные минимумому answer = '' for i in l: if i[1] == m: answer = answer + i[0] print(answer) # следующие решения из вики pythonchallenge.com мне показались интересными # можно ничего не считать, а просто выделить символы, допустимые для веб-ссылки 🙂 print (''.join([char for char in s if char.isalpha()])) # а это тоже самое, но с использовением filter print(list(filter(str.isalpha, s))) # и куда же без регулярных выражений import re rx = re.compile('[a-zA-Z]') print(rx.findall(s)) # ещё один простой метод - использовение множества checklist = set(s) for i in checklist: print(i, s.count(i)) # с множеством можно использовать Counter from collections import Counter checklist = set(s) print([x for x, y in Counter(s).items() if y == 1]) |
from urllib.request import urlopen # скачиваем страницу page = urlopen('http://www.pythonchallenge.com/pc/def/ocr.html') contents = page.read().decode() # выделяем из html зашифрованный код s = contents.split('<!--')[2].split('-->')[0] words = {} for i in s: # заполняем словарь методом get # ключ - символ из зашиврованного текста # значение - количество вхождений символа # используется метод get, который инициализирует значение нулём, если это первое вхождение words[i] = words.get(i, 0) + 1 # преобразуем словарь в список кортежей (символ, количество вхождений) l = list(words.items()) # сортируем по количеству вхождений l.sort(key = lambda i : i[1]) m = l[1][1] # первый элемент - это минимальное значение # отбираем все значения равные минимумому answer = '' for i in l: if i[1] == m: answer = answer + i[0] print(answer) # следующие решения из вики pythonchallenge.com мне показались интересными # можно ничего не считать, а просто выделить символы, допустимые для веб-ссылки 🙂 print (''.join([char for char in s if char.isalpha()])) # а это тоже самое, но с использовением filter print(list(filter(str.isalpha, s))) # и куда же без регулярных выражений import re rx = re.compile('[a-zA-Z]') print(rx.findall(s)) # ещё один простой метод - использовение множества checklist = set(s) for i in checklist: print(i, s.count(i)) # с множеством можно использовать Counter from collections import Counter checklist = set(s) print([x for x, y in Counter(s).items() if y == 1])
Основная идея лежит в использовании метода get у словаря, который хранит количество вхождений каждого символа в зашифрованном тексте. Get может возвращать значение по умолчанию, если ключа в словаре ещё нет (в нашем случае, если символ встретился первый раз, то возвращается ноль).
Ну, а дальше остаётся отсортировать словарь по количеству вхождений символов и отобрать минимальное.