Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 12, 2014 20:42:56

lioha1984
Зарегистрирован: 2014-12-12
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Есть две строки или два списка. Надо удалить окончания.

Есть две строки или два списка.
stem_rules = ('less', ‘ship’, ‘ing’, ‘es’, ‘ly’,'s')
text = ('friends', ‘very’, ‘friendly’, ‘keeping’, ‘friendship’)
Нужно основываясь на stem_rules удалить окончания из text.

получить: ('friend', ‘very’, ‘friend’, ‘keep’, ‘friend’)

Как это сделать при помощи функций map(),filter() и т.д., и функции lambda?

Отредактировано lioha1984 (Дек. 12, 2014 21:53:39)

Офлайн

#2 Дек. 12, 2014 21:28:53

botinag
Зарегистрирован: 2014-02-20
Сообщения: 179
Репутация: +  35  -
Профиль   Отправить e-mail  

Есть две строки или два списка. Надо удалить окончания.

lioha1984
удалить окончания
что это значит?
Распишите по-нормальному задачу. Желательно с примером что подается на входи и что имеем на выходе.

Офлайн

#3 Дек. 12, 2014 21:54:42

lioha1984
Зарегистрирован: 2014-12-12
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Есть две строки или два списка. Надо удалить окончания.

отредактировал.

Офлайн

#4 Дек. 12, 2014 22:42:42

botinag
Зарегистрирован: 2014-02-20
Сообщения: 179
Репутация: +  35  -
Профиль   Отправить e-mail  

Есть две строки или два списка. Надо удалить окончания.

stem_rules = ('less', 'ship', 'ing', 'es', 'ly','s')
text = ('friends', 'very', 'friendly', 'keeping', 'friendship')
def del_end(word, ends = stem_rules):
    for x in ends:
        if word.endswith(x):
            word = word[:-len(x)]
            break  # удаляем только первое попавшееся окончание
    return word

>>> map(del_end, text)
['friend', 'very', 'friend', 'keep', 'friend']
>>> map(lambda x: del_end(x), text) # или map(lambda x: del_end(x, stem_rules), text)
['friend', 'very', 'friend', 'keep', 'friend']
>>> f = lambda x: [del_end(y) for y in x]
>>> f(text)
['friend', 'very', 'friend', 'keep', 'friend']
Получилось довольно исскуственно. Тут наверное стоит смотреть в сторону регулярок, а я в них не разбираюсь.
Ну а спомощью filter можно найти те слова из списка у которых отсутствуют искомые окончания:
>>> filter(lambda x: x == del_end(x), text)
('very',)

Офлайн

#5 Дек. 13, 2014 01:32:16

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

Есть две строки или два списка. Надо удалить окончания.

Лучше ясно написать.

>>> stem_rules = ('less', 'ship', 'ing', 'es', 'ly','s')
>>> text = ('friends', 'very', 'friendly', 'keeping', 'friendship')
>>> 
>>> def f(lst, ends):
...     for i in lst:
...         o = i
...         for j in ends:
...             if i.endswith(j):
...                o = i[:-len(j)]
...                break
...         yield o
... 
>>> tuple(f(text, stem_rules))
('friend', 'very', 'friend', 'keep', 'friend')
>>>

Beautiful is better than ugly.
Simple is better than complex.
Complex is better than complicated.

Add
Добавил break после заметки от terabayt



Отредактировано py.user.next (Дек. 13, 2014 05:20:50)

Офлайн

#6 Дек. 13, 2014 02:27:25

Paranoia_Agent
Зарегистрирован: 2014-06-25
Сообщения: 75
Репутация: +  5  -
Профиль   Отправить e-mail  

Есть две строки или два списка. Надо удалить окончания.

Как вариант:
http://python.su/forum/topic/25775/

Офлайн

#7 Дек. 13, 2014 03:57:05

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Есть две строки или два списка. Надо удалить окончания.

print(tuple(map(lambda x: x.rstrip([i for i in stem_rules + ('',) if x.endswith(i)][0]), text)))



————————————————
-*- Simple is better than complex -*-

Офлайн

#8 Дек. 13, 2014 04:08:10

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Есть две строки или два списка. Надо удалить окончания.

py.user.next

>>> stem_rules = ('less', 'ship', 'ing', 'es', 'ly','s')
>>> text = ('fearless', 'heroes')
>>> 
>>> def f(lst, ends):
...     for i in lst:
...         o = i
...         for j in ends:
...             if i.endswith(j):
...                o = i[:-len(j)]
...         yield o
... 
>>> tuple(f(text, stem_rules))
('fearles', 'heroe')
>>>



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Дек. 13, 2014 04:08:39)

Офлайн

#9 Дек. 13, 2014 05:26:33

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

Есть две строки или два списка. Надо удалить окончания.

terabayt
print(tuple(...

>>> stem_rules = ('ing',)
>>> text = ('singing',)
>>> 
>>> print(tuple(map(lambda x: x.rstrip([i for i in stem_rules + ('',) if x.endswith(i)][0]), text)))
('s',)
>>>



Отредактировано py.user.next (Дек. 13, 2014 05:33:50)

Офлайн

#10 Дек. 13, 2014 06:30:50

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Есть две строки или два списка. Надо удалить окончания.

py.user.next
да, что-то я провтыкал с strip )
print(tuple(map(lambda x: x[:len(x)-len([i for i in stem_rules + ('',) if x.endswith(i)][0])], text)))



————————————————
-*- Simple is better than complex -*-

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version