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

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

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

35 ответов

11 просмотров

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

Алиби-Навечер Автор вопроса
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

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

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

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

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

читать файл максимально быстро? странный вопрос))
zamtmn
50
у меня такой вопрос про память в x86 возник, может кто пояснить?.. у процессора есть (как минимум) 3 типа адресов (названия "п1", "п2", "п3" --- мои, чтобы проще было дальше)...
Toideng
5
у процессора есть (как минимум) 3 типа адресов (названия "п1", "п2", "п3" --- мои, чтобы проще было дальше): - "п1" --- виртуальный адрес, то есть тот, который ресолвится в "п...
Toideng
3
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Hello, I need a hand, this is my code: body: ExtendedImageGesturePageView.builder( scrollDirection: Axis.vertical, controller: _pageController, itemCou...
𝘞𝘦𝘢𝘳𝘪𝘯𝘨𝘔𝘦𝘥𝘢𝘭 🦋
2
Guy, how to make redirecting to a page like this when http status 401?
Islam Kurbanov
8
Только что в чате Я.Вебмастера потратил я час на пустые споры с каким-то челом. Он с пеной у рта доказывал мне, что любой "самопис" - дерьмо, что у него дыры в безопасности, ...
Андрей [aharito] Харитонов
2
можно эстетический вопрос? у меня есть кучка мелких-мелких функций типа: function AddInteger(aparent:pointer; aname:PWideChar; aval:Int32):pointer; begin result:=AddNode(apa...
Alexey Kulakov
3
why html and css is not standard? i mean why different browser has their own engine and styles and how them work to show result to end user?
Mr Thieves
11
Добрый день. Хочу сделать отрисовку по команде на панели. Почему-то рисуется только при втором вызове. С чем может быть связано, не подскажете? procedure TForm1.FormDblClick(...
Kirill Filippenok
20
Карта сайта