Как найти среднюю длину слова в строке

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

Ramon Hallan's user avatar

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

thebjorn's user avatar

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

flamenco's user avatar

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

Community's user avatar

answered Oct 31, 2015 at 1:15

Andrew Shirley's user avatar

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

Leb's user avatar

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

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Здравствуйте, необходима помощь с заданием.
Дана строка текста, в которой слова разделены пробелами. Необходимо:
1. определить количество слов в строке;
2. найти среднюю длину слов в строке и вывести на экран слова такой длины, если их нет, то вывести сообщение «Таких слов нет»;
3. переставить слова в строке в обратном порядке, затем вывести на экран предложение.
1-й и 3-й пункт я сделал, соответственно нужна помощь со 2-ым.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <conio.h>
#include <string>
 
using namespace std;
 
int main ()
{
    string str;
 
    str = "ololol ololo ooolllool";
    int counter = 0;
    for (int i=0;i<str.size();i++)
    if (str[i]==' ') counter++;
    cout << "V zadannou stroke " << counter+1 << " clov(a)" << endl;
    for (int i=str.size();i>0;i--)
    cout << str[i];
    getch();
    return 0;
}



0



likehood

1272 / 1029 / 470

Регистрация: 25.12.2016

Сообщений: 3,333

20.02.2017, 19:07

2

Цитата
Сообщение от mazahaler
Посмотреть сообщение

3-й пункт я сделал

Такое впечатление создалось из-за того, что строка имеет весьма специфический вид. Если вместо неё взять строку “one two three”, то ошибка сразу станет видна.

—–
Вообще, такие задачи решаются с помощью строковых потоков (stringstream). Вот пример разбиения строки на слова:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <string>
#include <sstream>
 
using namespace std;
 
int main ()
{
    string s = "one two three";
    string word;
    istringstream str(s);
    while (str >> word) {
        cout << word << endl;
    }
 
   return 0;
}

Если нужно вывести слова в обратном порядке, их можно сначала поместить в вектор.



2



Peoples

Эксперт С++

1623 / 953 / 782

Регистрация: 06.02.2016

Сообщений: 2,449

Записей в блоге: 30

20.02.2017, 19:22

3

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <algorithm>
#include <string>
#include <sstream>
#include <numeric>
#include <vector>
#include <iterator>
using namespace std;
int main() {
    string s {};
    getline(cin,s);
    stringstream ss(s);
    vector<string>v {istream_iterator<string>(ss),istream_iterator<string>()};
    cout<<v.size()<<endl;
    double avg=static_cast<double>(accumulate(v.cbegin(),v.cend(),0,[](const int &x, const string &s) {
        return x+s.length();
    }))/v.size();
    cout<<avg<<endl;
    if(any_of(v.cbegin(),v.cend(),[&avg](const string &s) { return s.length()==avg; })) {
        copy_if(v.cbegin(),v.cend(),ostream_iterator<string>(cout," "),[&avg](const string &s) {
            return s.length()==avg;
        });
    }
    else cout<<"There are not this words"<<endl;
    cout<<endl;
    copy(v.crbegin(),v.crend(),ostream_iterator<string>(cout," "));
}



1



Photofenix

63 / 63 / 39

Регистрация: 18.11.2016

Сообщений: 562

20.02.2017, 19:28

4

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <cstdlib>
#include <string>
#include <sstream>
 
    int main (){
        
        setlocale(LC_ALL, "rus");
 
        register unsigned int count_word (0); // Слова
        register unsigned int count_letter (0); // Буквы
        std::string strone = "hello this world, you you are so beautiufl"; // Строка один
        std::string strtwo; // Пустая строка.
        std::istringstream str (strone);
 
        while (str >> strtwo){ // Подчитываем количесво строк.
            count_word ++;
            }
        
        for (int i(0); strone[i]; i++){
            
            strone[i] == ' ' ? false : count_letter ++;
        }
 
        std::cout << "Количество слов: "
                  << count_word
                  << std::endl
                  << "Количество букв: "
                  << count_letter
                  << std::endl
                  << "Среднее количество букв в слове: "
                  << count_letter/count_word
                  << std::endl;
 
 
        system ("pause");
        return 0;
    }



1



MrGluck

Форумчанин

Эксперт CЭксперт С++

8194 / 5044 / 1437

Регистрация: 29.11.2010

Сообщений: 13,453

20.02.2017, 19:40

5

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <iterator>
#include <numeric>
#include <sstream>
#include <string>
 
int main()
{
    std::string str;
    std::getline(std::cin, str);
 
    std::istringstream ist(str);
    using input_str = std::istream_iterator<std::string>;
    size_t num = 0, sum = std::accumulate(input_str(ist), input_str(), size_t(0),
        [&num](const size_t x, const std::string &str)
    {
        ++num;
        return x + str.length();
    });
    if (num)
        std::cout << static_cast<double>(sum) / num << std::endl;
}

Добавлено через 1 минуту

Цитата
Сообщение от Photofenix
Посмотреть сообщение

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++)

Сложность: средняя.

Решение задачи

Для того чтобы разобраться в этой задаче вам нужно посмотреть (эту). Там мы искали самое длинное слово. Тут почти тоже самое, только тут всё легче.

Мы в цикле будем искать длину каждого слова и заносить в общую сумму. А потом поделим на количество слов.

Для того чтобы найти среднюю длину слов в заданной строке нам понадобятся следующие переменные :

  • Переменная str — для нашей строки
  • Переменная average — для средней длины слов
  • Переменная summa — для суммы слов
  • Переменная count — для количества слов
  • Указатель ptr — для слова.
  • Начнем мы с каркаса нашей программы

    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++. Определить четность числа

    Добавить комментарий