Доброго времени суток. Сам я программирую в java и немного в Delphi, а тут попросили сделать задачку на питоне. Задача следущая: есть набор русских слов в файле, разделённых пробелами, пунктуацией, а также числами. Необходимо подсчитать количество одинаковых слов и вывести их на консоль в отсортированном по алфавиту словаре в виде (слово, количество). Проблема оказалась в том, что для русской локали е и ё - абсоллютно одинаковые буквы, в то время, как в алфавите е идет перед ё, т. е. слово “ель” должно становиться перед словом “ёлка”. Пришлось искать возможности создания правил сортировки. Я обнаружил, что для питона 2 в функции сортировки есть ключ cmp для компаратора, но делать компаратор для кирилицы в питоне 2 мне показалось нетривиальной задачей. У питона 3 с UTF-8 дела обстоят получше, но компаратор, как таковой, в нём использовать уже нельзя. Зато там есть костыль в виде функции cmp_to_key, которым я в итоге и воспользовался. Вот что у меня получилось:
from codecs import open
from functools import cmp_to_key
from re import split
text = open("load", "r", "utf-8")
s = text.read()
words = split('[\d\W]+', s)
d = {}
for w in words:
if w != '':
if w in d:
d[w] += 1
else:
d[w] = 1
items = list(d.items())
def comparator(a, b):
x = str(a)
y = str(b)
t = len(x) if len(x) < len(y) else len(y)
for j in range(t):
if x[j] == y[j]:
continue
if x[j] != 'ё' and y[j] != 'ё':
if x[j] < y[j]:
return -1
else:
return 1
elif x[j] == 'ё':
if y[j] > 'е':
return -1
else:
return 1
elif y[j] == 'ё':
if x[j] > 'е':
return 1
else:
return -1
if len(x) < len(y):
return -1
elif len(x) > len(y):
return 1
else:
return 0
items.sort(key=cmp_to_key(comparator))
for i in items:
print(i)
Код работает, понятно, что он не идеален и не учитывает заглавные буквы, но это можно доделать. Меня удивляет другое. Я слышал, что у питона очень развиты библиотеки работы с текстом, но я, если честно, этого не почувствовал. В java подобный компаратор создать на порядок проще - там для этого есть класс RuleBasedCollator. Неужели в питоне для такой типовой задачи надо делать костыли? Или есть более простой путь, который я не нашел? Буду рад, если вы меня просветите.
Спасибо!
З. Ы. Вообще, питон - интересный язык, можно побаловаться. Напрягают только различия 2 и 3 версий.