Программа считает количество строк, слов и букв в переданном ей файле.
Имя файла должно передаваться в качестве первого аргумента после имени самого скрипта. Например, вызов скрипта в Linux через командную оболочку выглядит примерно так:
Пример выполнения скрипта в командной оболочке bash
Вводится строка, состоящая из слов, разделенных пробелами. Требуется посчитать количество слов в ней.
- Введем счетчик слов и переменную-флаг, сигнализирующую, находимся ли мы внутри слова или нет.
- Если очередной символ не пробел, и флаг показывает, что мы не внутри слова, то следует увеличить переменную-счетчик слов и изменить флаг.
- Иначе если текущий символ пробел, то установить флаг в значение "вне слова". (Когда символ не пробел, и мы находимся внутри слова, то ничего делать не надо.)
main ( ) <
char str [ 255 ] ;
int i , count , flag ;
gets ( str ) ;
count = 0 ;
flag = 0 ;
for ( i = 0 ; str [ i ] != ‘ ‘ ; i ++ )
if ( str [ i ] != ‘ ‘ && flag == 0 ) <
count += 1 ;
flag = 1 ;
> else
if ( str [ i ] == ‘ ‘ ) flag = 0 ;
printf ( "%d
" , count ) ;
>
# 1-й вариант ("классический"):
s = input ( )
count = 0
flag = 0
for i in range ( len ( s ) ) :
if s [ i ] != ‘ ‘ and flag == 0 :
count + = 1
flag = 1
else :
if s [ i ] == ‘ ‘ :
flag = 0
print ( count )
# 2-й вариант (через преобразование в список):
s = input ( )
s = s. split ( )
l = len ( s )
print ( l )
Метод split() разбивает строку по пробелам (по умолчанию) или символам, которые передаются как аргументы. Возвращает список.
Ниже приведенный скрипт на Python подсчитывает частоту слов в тексте (непрерывных последовательностей букв за исключением знаков препинания) и выводит таблицу результатов.
Работает правильно. Вопрос вот в чем: можно ли сделать то же самое проще (например, меньше строк кода) на Python, Bash, PHP, Perl или это лучший способ?
7 Answers
Скрипт на bash/awk, для коллекции:
Подсчёт частоты слов с поддержкой Unicode ( .casefold() , w+ ):
- текст, в кодировке из локали, задаётся из файлов, указанных в командной строке, или со стандартного ввода (если не указаны)
- слова выводятся в порядке убывания популярности
- кодировка для вывода может отличаться от кодировки на входе
- выводит построчно, с указанным в вопросе форматированием (ширина под слово — 32 символа)
Вот версия, близкая к поведению Питон 2 кода из вопроса:
- читает байты из файла, переводит их в нижний регистр, разбивает на слова по стандартному пробелу (не поддерживает Unicode)
- удаляет ascii пунктуацию из каждого слова (может пустая строка остаться)
- считает получившиеся слова, сортирует их по величине байт
- выводит построчно, с указанным в вопросе форматированием (ширина под слово — 32 байта)
Два примера разный вывод генерируют как правило.