Форум сайта python.su
Есть две строки или два списка.
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)
Офлайн
lioha1984что это значит?
удалить окончания
Офлайн
отредактировал.
Офлайн
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(lambda x: x == del_end(x), text)
('very',)
Офлайн
Лучше ясно написать.
>>> 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.
Отредактировано py.user.next (Дек. 13, 2014 05:20:50)
Офлайн
Как вариант:
http://python.su/forum/topic/25775/
Офлайн
print(tuple(map(lambda x: x.rstrip([i for i in stem_rules + ('',) if x.endswith(i)][0]), text)))
Офлайн
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') >>>
Отредактировано terabayt (Дек. 13, 2014 04:08:39)
Офлайн
terabaytprint(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)
Офлайн
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)))
Офлайн