def word_count (x: str) -> str:
characters = len(x)
word = len(x.split())
average = sum(len(x) for x in word)/len(word)
print('Characters: ' + str(char) + 'n' + 'Words: ' + str(word) + 'n' + 'Avg word length: ' + str(avg) + 'n')
This code works fine for normal strings, but for a string like:
'***The ?! quick brown cat: leaps over the sad boy.'
How do I edit the code so that figures like “***” and “?!” aren’t accounted for in the code? The average word count of the sentence above should turn out to be 3.888889, but my code is giving me another number.
asked Oct 31, 2015 at 1:07
4
Strings have a .translate()
method you can use for this (if you know all characters you want deleted):
>>> "***foo ?! bar".translate(None, "*?!")
'foo bar'
answered Oct 31, 2015 at 2:57
thebjornthebjorn
26k11 gold badges93 silver badges136 bronze badges
Try this:
import re
def avrg_count(x):
total_chars = len(re.sub(r'[^a-zA-Z0-9]', '', x))
num_words = len(re.sub(r'[^a-zA-Z0-9 ]', '', x).split())
print "Characters:{0}nWords:{1}nAverage word length: {2}".format(total_chars, num_words, total_chars/float(num_words))
phrase = '***The ?! quick brown cat: leaps over the sad boy.'
avrg_count(phrase)
Output:
Characters:34
Words:9
Average word length: 3.77777777778
answered Oct 31, 2015 at 2:45
flamencoflamenco
2,6924 gold badges29 silver badges46 bronze badges
You should be able to trim all non-alphanumeric characters from each word, and then only use the word when the length is still greater than 0. The first solution I found was a regex solution, but you might be able to find other ways to get it done.
Stripping everything but alphanumeric chars from a string in Python
answered Oct 31, 2015 at 1:15
import re
full_sent = '***The ?! quick brown cat: leaps over the sad boy.'
alpha_sent = re.findall(r'w+',full_sent)
print(alpha_sent)
Will output:
['The', 'quick', 'brown', 'cat', 'leaps', 'over', 'the', 'sad', 'boy']
To get average you can do:
average = sum(len(word) for word in alpha_sent)/len(alpha_sent)
Which will give: 3.77
answered Oct 31, 2015 at 2:49
LebLeb
15.3k9 gold badges56 silver badges75 bronze badges
2
Задача – определить среднюю длину слова во введённой текстовой строке.
Учесть, что символы пунктуации на длину слов влиять не должны. Получилось вот так:
class Program
{
public static void Main(string[] args)
{
Go ob = new Go();
ob.MiddleString();
Console.ReadLine();
}
}
class Go
{
public void MiddleString()
{
int allWordLength = 0;
int wordLength = 0;
int indBegin = 0;
int indLast = 0;
string str1 = "написать прогамму, которая";
var mas = str1.Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < mas.Length; i++)
{
indBegin = Array.IndexOf(mas, mas[i]); //здесь отладчик просто принимает значение indBegin
indLast = Array.LastIndexOf(mas, mas[i]); // здесь отладчик просто принимает значение indLast
wordLength = indLast - indBegin;
allWordLength = allWordLength + wordLength;
}
Console.WriteLine(allWordLength / mas.Length);
}
}
Метод MiddleString по задумке должен содержать два цикла. Внешний проходит по всему массиву(нашей бывшей строке), а внутренний – по подстрокам, попутно вычисляя начальные и конечные индексы, складывая их и таким образом, находя среднюю длину слова. Не получается обращаться элементам массива через цикл. Что-то я уже мозг сломал. Кто может, помогите советом.
PS: изменил метод MiddleString. Вроде, можно обойтись одним циклом. Конкретно, теперь не получается определить начальный и конечный индексы элементов массива(т.е., подстрок строки str1), и, соответственно, просчитать среднюю длину слов в массиве. indBegin и indLast всегда принимают значение i. ???
mazahaler 6 / 6 / 4 Регистрация: 01.10.2015 Сообщений: 327 |
||||
1 |
||||
Найти среднюю длину слов в строке20.02.2017, 17:57. Показов 11841. Ответов 4 Метки нет (Все метки)
Здравствуйте, необходима помощь с заданием.
0 |
likehood 1272 / 1029 / 470 Регистрация: 25.12.2016 Сообщений: 3,333 |
||||
20.02.2017, 19:07 |
2 |
|||
3-й пункт я сделал Такое впечатление создалось из-за того, что строка имеет весьма специфический вид. Если вместо неё взять строку “one two three”, то ошибка сразу станет видна. —–
Если нужно вывести слова в обратном порядке, их можно сначала поместить в вектор.
2 |
Peoples 1623 / 953 / 782 Регистрация: 06.02.2016 Сообщений: 2,449 Записей в блоге: 30 |
||||
20.02.2017, 19:22 |
3 |
|||
1 |
Photofenix 63 / 63 / 39 Регистрация: 18.11.2016 Сообщений: 562 |
||||
20.02.2017, 19:28 |
4 |
|||
1 |
MrGluck Форумчанин 8194 / 5044 / 1437 Регистрация: 29.11.2010 Сообщений: 13,453 |
||||
20.02.2017, 19:40 |
5 |
|||
Добавлено через 1 минуту
register deprecated в C++17
1 |
Задача – определить среднюю длину слова во введённой текстовой строке.
Учесть, что символы пунктуации на длину слов влиять не должны. Получилось вот так:
class Program
{
public static void Main(string[] args)
{
Go ob = new Go();
ob.MiddleString();
Console.ReadLine();
}
}
class Go
{
public void MiddleString()
{
int allWordLength = 0;
int wordLength = 0;
int indBegin = 0;
int indLast = 0;
string str1 = "написать прогамму, которая";
var mas = str1.Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < mas.Length; i++)
{
indBegin = Array.IndexOf(mas, mas[i]); //здесь отладчик просто принимает значение indBegin
indLast = Array.LastIndexOf(mas, mas[i]); // здесь отладчик просто принимает значение indLast
wordLength = indLast - indBegin;
allWordLength = allWordLength + wordLength;
}
Console.WriteLine(allWordLength / mas.Length);
}
}
Метод MiddleString по задумке должен содержать два цикла. Внешний проходит по всему массиву(нашей бывшей строке), а внутренний – по подстрокам, попутно вычисляя начальные и конечные индексы, складывая их и таким образом, находя среднюю длину слова. Не получается обращаться элементам массива через цикл. Что-то я уже мозг сломал. Кто может, помогите советом.
PS: изменил метод MiddleString. Вроде, можно обойтись одним циклом. Конкретно, теперь не получается определить начальный и конечный индексы элементов массива(т.е., подстрок строки str1), и, соответственно, просчитать среднюю длину слов в массиве. indBegin и indLast всегда принимают значение i. ???
Условие задачи: Найти среднюю длину слов в заданной строке. Строку вводит пользователь (Язык C++)
Сложность: средняя.
Решение задачи
Для того чтобы разобраться в этой задаче вам нужно посмотреть (эту). Там мы искали самое длинное слово. Тут почти тоже самое, только тут всё легче.
Мы в цикле будем искать длину каждого слова и заносить в общую сумму. А потом поделим на количество слов.
Для того чтобы найти среднюю длину слов в заданной строке нам понадобятся следующие переменные :
Начнем мы с каркаса нашей программы
int
main()
{
setlocale
(LC_ALL,
"Russian"
);
// включаем русский язык
char
str[256];
cout <<
"Введите строку : "
; cin.getline(str,256);
double
average, summa , count ;
summa = 0;
count = 0;
char
* ptr=
strtok
(str,
" .,!?"
);
system
(
"PAUSE"
);
// чтобы программа не закрывалась
return
0 ;
// возвращаем функции main() ноль
}
Тут мы объявили все переменные, просим пользователя ввести строку и присвоили начальные значения summa и count.
Ну а дальше цикл :
do
{
summa = summa +
strlen
(ptr);
count = count + 1;
}
while
(ptr=
strtok
(NULL,
" .,!?"
));
Пускаем цикл, сразу прибавляем в общую сумму длину слова, и увеличиваем кол-во слов на 1.
Теперь считаем среднюю длину, точно также как считаем среднее арифметическое, делим сумму слов на их кол-во.
average = summa / count ;
cout <<
"Средняя длинна слов равна : "
<< average << endl;
Всё решение задачи C++
#include <iostream>
using
namespace
std;
int
main()
{
setlocale
(LC_ALL,
"Rus"
);
// включаем русский язык
char
str[256];
// объявляем строку
cout <<
"Введите строку : "
; cin.getline(str,256);
// просим пользователя ввести строку
double
average, summa , count ;
// объявляем переменные
summa = 0;
// обнуляем
count = 0;
// обнуляем
char
* ptr=
strtok
(str,
" .,!?"
);
// создаем указатель
do
{
summa = summa +
strlen
(ptr);
// считаем сумму
count = count + 1;
// увеличиваем кол-во слов
}
while
(ptr=
strtok
(NULL,
" .,!?"
));
average = summa / count ;
// считаем среднюю длину
cout <<
"Средняя длинна слов равна : "
<< average << endl;
// выводим среднюю длину
system
(
"pause"
);
// чтобы программа не закрывалась
return
0;
}
Предыдущая
ПрограммированиеЗадачи по C++. Деление числа на 3.
Следующая
ПрограммированиеЗадачи по C++. Определить четность числа