Найти - Пользователи
Полная версия: сортировка русских слов компаратором
Начало » Python для новичков » сортировка русских слов компаратором
1 2 3 4 5
Rodegast
Смотри что из файла идёт. Первого символа нет в списке/словаре.
FishHook
сделай
print(items)
у тебя там не отдельные слова
FishHook
Rodegast
Смотри что из файла идёт. Первого символа нет в списке/словаре.
у него первый символ “метла”
py.user.next
>>> lst = ['а', 'б', 'е', 'ё',
...        'А', 'Б', 'Е', 'Ё',
...        'ба', 'вб', 'ёе', 'жё',
...        'БА', 'ВБ', 'ЁЕ', 'ЖЁ']
>>> 
>>> def tr(s):
...     alpha = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя' \
...             'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'
...     return tuple(map(alpha.index, s))
... 
>>> lst.sort(key=tr)
>>> lst
['а', 'б', 'ба', 'вб', 'е', 'ё', 'ёе', 'жё', 'А', 'Б', 'БА', 'ВБ', 'Е', 'Ё', 'ЁЕ', 'ЖЁ']
>>>

Pawl
Или есть более простой путь, который я не нашел?
Конечно, есть. У тебя код больше дельфийский, а там как бы не принятно использовать функциональные фишки.
Pawl
py.user.next
Конечно, есть. У тебя код больше дельфийский, а там как бы не принятно использовать функциональные фишки.
Да, с этим у меня проблемы Спасибо за пример, но вы укзываете сортировку списка, а у меня - карта (или словарь по-питонски ) К сожалению, ваш вариант с картой не проходит.
Shaman
http://stackoverflow.com/questions/1097908/how-do-i-sort-unicode-strings-alphabetically-in-python
Да, я делал вариант по аналогии:
from codecs import open
from re import split
import locale
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())
locale.setlocale(locale.LC_ALL, "")
items.sort(key=lambda item: locale.strxfrm(item[0]))
for i in items:
    print(i)
но в этом случае локаль не делает разницы между е и ё (ель выводится после ёлки)
FishHook
1. словари в питоне не сортируются
2. Вот тут ты делаешь из словаря список кортежей
items = list(d.items())
3. Далее ты пытаешься сортировать список кортежей
4. Сделай уже print(items) и всё станет ясно.
Pawl
FishHook
у тебя там не отдельные слова
FishHook
Сделай уже print(items) и всё станет ясно.
Да, стало ясно, спасибо.
FishHook
Вот тут ты делаешь из словаря список кортежей
Действительно, у меня в списке пары слово-количество.
Попробовал модифицировать ваш пример
d = [u'ё', u'ель', u'ямка', u'ёлочка', u'упырь', u'ёжик', u'ё моё', u'е',  u'ельник', u'ежовый', u'ягель']
ALPHABET = {i[1]: i[0] for i in enumerate(u"абвгдеёжзийклмнопрстуфхцчшщъыьэюя")}
for i in sorted(d, key=lambda x: ALPHABET[x[0].lower()]):
    print (i)
Вот что получилось:
from codecs import open
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())
ALPHABET = {i[1]: i[0] for i in enumerate(u"абвгдеёжзийклмнопрстуфхцчшщъыьэюя")}
sorted(items, key=lambda x: ALPHABET[x[0][0].lower()])
for i in items:
    print(i)
Однако, так сортируется неправильно:
('ёжик', 1)
('метёлка', 1)
('ель', 2)
('улитка', 3)
('метла', 1)
('мороз', 1)
('ежевика', 3)
('емеля', 1)
('мёд', 1)
('муляж', 1)
('ёлка', 3)
Я как-то не так обращаюсь к ключу?
FishHook
Да блин! sorted не изменяет исходный список, в вашей интерпретации эта операция бессмысленна.
Shaman
corpus = [u'ё', u'ель', u'ямка', u'ёлочка', u'упырь', u'ёжик', u'ё моё', u'е',  u'ельник', u'ежовый', u'ягель']
import locale
locale.setlocale(locale.LC_ALL, "")
corpus.sort(cmp=locale.strcoll)  # corpus.sort(key=locale.strxfrm)
print ' '.join(corpus)
е ё ё моё ёжик ежовый ёлочка ель ельник упырь ягель ямка
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB