170 похожих чатов

Добрый день. В тесте попалось задание в котором нужно написать

скрипт который запрашивает название файла у пользователя, затем выводит все буквы используемые в тексте файла в порядке убывания их количества. Например
А-132
Б-100
В-46
И тд
С заданием я справился, но мне интересно, есть ли более короткие, дешёвые и простые способы сортировки?

35 ответов

21 просмотр

а зачем тут регулярка...

Алиби-Навечер Автор вопроса
ZeN
а зачем тут регулярка...

Решил обойтись без словарей, подумал так интереснее и вышло даже быстрее

Алиби-Навечер Автор вопроса
ZeN
а словари тут зачем

А как тогда ты бы написал?

Алиби Навечер
А как тогда ты бы написал?

получил бы весь текст файла, прошелся по каждой букве алфавита, через 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('файл не найден')

ZeN
получил бы весь текст файла, прошелся по каждой бу...

В отличие от регулярок и NumPy этот вариант не оптимизирован на уровне CPython, скорее всего будет менее производительно.

Алиби Навечер
А отсортировал бы как?

Ну, сортировка там уже шаг тривиальный. Сочетание sort с конкретным типом данных, в которые стата складывается.

Если ты уже упростил себе работу с помощью регулярных выражений, то почему бы не использовать collections.Counter?

Алиби-Навечер Автор вопроса
Алиби Навечер
import re abc_list=[] count_abc_list=[] file_name...

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)

Саша Воронов
In [9]: %timeit test_re() 7.68 s ± 122 ms per loop...

Прикольно. Какая версия 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

Roman Voronov
Прикольно. Какая версия Python, какой принцип алго...

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.

Саша Воронов
In [9]: %timeit test_re() 7.68 s ± 122 ms per loop...

Кто тоже хочет поэкспериментировать - можем генерировать текстовый файл так: # 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 символы)) а далее в один проход по массиву символов составляешь массив частот встречаемости а далее надо отсортировать массив этих частот по убыванию и вывести все его значения

Roman Voronov
Кто тоже хочет поэкспериментировать - можем генери...

python -c “from lorem_text import lorem; print(lorem.words(int(1e7)))” > lorem.txt

Медленнее всего показали себя регулярки (ожидаемо)

Сашин подход неоспоримый топ:

Roman Voronov
Медленнее всего показали себя регулярки (ожидаемо)

Убожество, зачем весь код в try оборачивать?

Kan
Убожество, зачем весь код в try оборачивать?

Опоздал, уже пошучено https://t.me/ru_python_beginners/1960893

Roman Voronov
screenshot Сашин подход неоспоримый топ:

Простите, наврал - забыл саму функцию запустить. Подход через NumPy быстрее:

Давай ещё isalpha = str.isalpha

Tishka17
Давай ещё isalpha = str.isalpha

Имхо, не должно сильно отразиться, но щас проверю

А в файле сколько строк?

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта