Форум сайта python.su
Всем здравствуйте!
Не могли бы Вы, пожалуйста, помочь с таким вот заданием:
в тексте находятся слова с минимум двумя гласными в начале или конце слова; они записываются в словарь; создается частотный список этих слов и записывается в csv-файл.
Собственно, интересует, как нужно записывать в словарь и далее сделать список? Совсем нчиего не понимаю -_-
Вот все мои отрывки кода:
import codecs, re f = codecs.open(u'text.txt', 'r', 'utf-8') words = [] d = {} frequency = 0 for line in f: for word in line.split(): word = word.lower() word = word.strip(u'.,:;-()?!') words.append(word) f.close() for i in range(len(words)): v = u'(^[аеёиоуыэюя]{2,})|([аеёиоуыэюя]{2,}$)' m = re.findall(v, words[i]) if m != []: for key in words: if key in d: value = d[key] f = open(u'dict.csv', 'w', 'utf') f.close()
Офлайн
Kato
у вас слова, которые прошли регулярное выражение нигде не накапливаются. Переменная m каждый раз затирается новым списком.
То что вы называете частотным списком, думаю нужно обратить внимание на itertools.groupby()
Офлайн
а можно просто freuqency += 1, когда слово встречается снова?
и потмо в словаре как-нибудь упорядочить по этому значению для каждого
Офлайн
Я кажется понял что вам нужно:
# -*- coding: utf-8 -*- import codecs, re d = {} v=u'([аеёиоуыэюя]{2,}.*[аеёиоуыэюя]{2,})' with codecs.open(u'text.txt', 'r', 'utf-8') as f: for line in f: for word in line.split(): word = word.lower().strip(u'.,:;-()?!') if re.match(v, word): if d.has_key(word): d[word]+=1 else: d[word]=1 for key, value in d.items(): print '{} = {}'.format(key, value)
import csv
Отредактировано JOHN_16 (Фев. 26, 2013 02:09:35)
Офлайн
Спасибо! а не могли бы, пожалуйста, рассказать про with и as?
с записью файла вопросов пока нет, подобное делали и в общем-то,представляю- просто не стал расписывать, пока наболевшие темы непонятны
Офлайн
документация и интернет расскажет больше и лучше, в данном случае основное его предназначение сделать код более красивым и автоматически закрыть файл после выполнения кода внутри блока.
Если вам надо еще и отсортировать по частоте слов, то нужно использовать функцию сортировки sorted():
for key, value in sorted(d.items(), key=lambda x: x[1], reverse=True): print '{} = {}'.format(key, value)
Офлайн
JOHN_16
Зачем рекомендуете has_key для словаря, она же deprecated.
defaultdict(int) для данной задачи более уместен, а Counter еще больше упрощает реализацию
# -*- coding: utf-8 -*- import codecs, re from collections import defaultdict, Counter from operator import itemgetter def words(fname): with codecs.open(fname, 'r', 'utf-8') as f: for line in f: for word in line.split(): yield word.lower().strip(u'.,:;-()?!') # вариант с defaultdict def freuqency(words): template = re.compile(u'([аеёиоуыэюя]{2,}.*[аеёиоуыэюя]{2,})').match result = defaultdict(int) for word in filter(template, words): result[word] += 1 return result # вариант с Counter def freuqency(words): template = re.compile(u'([аеёиоуыэюя]{2,}.*[аеёиоуыэюя]{2,})').match return Counter(filter(template, words))
# вывод результата for key, value in sorted(freuqency(words('text.txt')).items(), key=itemgetter(1), reverse=True): print '{} = {}'.format(key, value)
Отредактировано pyuser (Фев. 26, 2013 04:06:13)
Офлайн
pyuser
соглашусь с вами, и работает быстрее.
Офлайн
а вот, к примеру, если с помощью re.sub нужно заменить “коа” на “пёс”, что нужно указать в регулярном , чтобы он не менял и слово “котовый”?
Офлайн
например так:
import re s = 'коала, коа, котовый, акоазм' print(re.sub(r'\bкоа\b', 'пёс', s))
Офлайн