а зачем тут регулярка...
Решил обойтись без словарей, подумал так интереснее и вышло даже быстрее
а словари тут зачем
А как тогда ты бы написал?
скинь текстом, посмотрим, насколько быстрее
получил бы весь текст файла, прошелся по каждой букве алфавита, через string.count() посмотрел сколько раз она повторяется и вывел
Как вариант я бы попробовал через NumPy array и посмотрел бы, что быстрее - регулярка или массив.
import re abc_list=[] count_abc_list=[] file_name = input('введите название файла >>>') try: file = open(file_name, 'r', encoding='utf-8') abc_text = re.sub('[^\w]', '', file.read().lower()) abc_text = re.sub('[_0-9]', '', abc_text) while len(abc_text)>0: abc_len = len(re.findall(abc_text[0], abc_text)) count_abc_list.append(abc_len) count_abc_list.sort(reverse=True) abc_list.insert(count_abc_list.index(abc_len), abc_text[0]) abc_text = re.sub(abc_text[0], '', abc_text) for count in range(0, len(abc_list)): print(abc_list[count], count_abc_list[count]) except: print('файл не найден')
В отличие от регулярок и NumPy этот вариант не оптимизирован на уровне CPython, скорее всего будет менее производительно.
А отсортировал бы как?
Ну, сортировка там уже шаг тривиальный. Сочетание sort с конкретным типом данных, в которые стата складывается.
Если ты уже упростил себе работу с помощью регулярных выражений, то почему бы не использовать collections.Counter?
Не слышал о таком, пойду прогуглю
In [9]: %timeit test_re() 7.68 s ± 122 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) In [10]: %timeit mine() 4.22 s ± 26.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Прикольно. Какая версия Python, какой принцип алгоритма?
In [6]: def mine(): ...: import collections ...: counter = collections.defaultdict(int) ...: ...: file_name = input('введите название файла >>>') ...: ...: with open(file_name) as f: ...: for line in f: ...: for ch in filter(str.isalpha, line): ...: counter[ch] += 1 ...: print(counter) ...: In [7]: input = lambda _: 'lorem.txt' In [8]: print = lambda _: None
Python 3.9.12 (main, Apr 5 2022, 15:59:20) Type 'copyright', 'credits' or 'license' for more information IPython 8.2.0 -- An enhanced Interactive Python. Type '?' for help.
Кто тоже хочет поэкспериментировать - можем генерировать текстовый файл так: # pip install faker from faker import Faker fake = faker.Faker() text = fake.text(10000) with open("fake.txt", "x") as file: file.write(text)
есть вариант эффективной сортировки когда количество символов в массиве ограничено небольшим количеством символов заводишь массив длиною в максимальное количество символов (например если это символы английского алфавита то заводишь массив длиною в 26 (ну или 52 если так же разрешены upper case символы)) а далее в один проход по массиву символов составляешь массив частот встречаемости а далее надо отсортировать массив этих частот по убыванию и вывести все его значения
python -c “from lorem_text import lorem; print(lorem.words(int(1e7)))” > lorem.txt
Сколько ты этому учился?
Этому непонятно чему
Чему тут учится?
Медленнее всего показали себя регулярки (ожидаемо)
Убожество, зачем весь код в try оборачивать?
print не возвращает ничего
Опоздал, уже пошучено https://t.me/ru_python_beginners/1960893
Простите, наврал - забыл саму функцию запустить. Подход через NumPy быстрее:
Давай ещё isalpha = str.isalpha
Имхо, не должно сильно отразиться, но щас проверю
А в файле сколько строк?
Обсуждают сегодня