Уведомления

Группа в Telegram: @pythonsu

#1 Май 25, 2015 11:48:53

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

сортировка русских слов компаратором

Смотри что из файла идёт. Первого символа нет в списке/словаре.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#2 Май 25, 2015 11:49:52

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

сортировка русских слов компаратором

сделай

print(items)
у тебя там не отдельные слова



Офлайн

#3 Май 25, 2015 11:50:33

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

сортировка русских слов компаратором

Rodegast
Смотри что из файла идёт. Первого символа нет в списке/словаре.
у него первый символ “метла”



Офлайн

#4 Май 25, 2015 12:36:44

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

сортировка русских слов компаратором

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

Pawl
Или есть более простой путь, который я не нашел?
Конечно, есть. У тебя код больше дельфийский, а там как бы не принятно использовать функциональные фишки.



Отредактировано py.user.next (Май 25, 2015 12:47:56)

Офлайн

#5 Май 25, 2015 13:29:30

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

сортировка русских слов компаратором

Офлайн

#6 Май 25, 2015 16:29:45

Pawl
Зарегистрирован: 2015-05-25
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

сортировка русских слов компаратором

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)
но в этом случае локаль не делает разницы между е и ё (ель выводится после ёлки)

Офлайн

#7 Май 25, 2015 16:46:12

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

сортировка русских слов компаратором

1. словари в питоне не сортируются
2. Вот тут ты делаешь из словаря список кортежей

items = list(d.items())
3. Далее ты пытаешься сортировать список кортежей
4. Сделай уже print(items) и всё станет ясно.



Офлайн

#8 Май 25, 2015 17:16:30

Pawl
Зарегистрирован: 2015-05-25
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

сортировка русских слов компаратором

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)
Я как-то не так обращаюсь к ключу?

Офлайн

#9 Май 25, 2015 17:19:03

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

сортировка русских слов компаратором

Да блин! sorted не изменяет исходный список, в вашей интерпретации эта операция бессмысленна.



Офлайн

#10 Май 25, 2015 17:30:48

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

сортировка русских слов компаратором

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)
е ё ё моё ёжик ежовый ёлочка ель ельник упырь ягель ямка

Отредактировано Shaman (Май 25, 2015 18:04:57)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version