Подсчитайте количество слов и строк, которые имеют несколько гласных в Python - PullRequest
0 голосов
/ 24 мая 2019

Я работаю над этой проблемой кодирования «Подсчитать количество слов и строк, которые имеют более X гласных для каждого Y слов в каждой строке Z»

В основном входная строка имеет несколько строк, и мне нужноподсчитать слова, содержащие в себе X или более гласных.Но ограничением является то, что мне нужно рассмотреть только альтернативную Z-ю строку, а также альтернативное Y-е слово в этих Z-х строках.Например, скажем, мне нужно посчитать каждое 3-е слово, содержащее 2 или более гласных в каждой 3-й строке.Так вот X=2, Y=3, Z=3.Проверьте ниже входную строку:

"1.When I first brought my cat home.
 2.It cost a lot to adopt her.
 3.I paid forty dollars for it.
 4.And then I had to buy litter, a litterbox.
 5.Also bought food, and dishes for her to eat out of. 
 6.There's a **leash** law for cats in Fort **Collins**.
 7.If they're not in your yard they have to be on a leash. 
 8.Anyway, my cat is my best friend. 
 9.I'm glad I got her. 
 10.She sleeps under the covers with me when it's cold."

Вывод: Количество слов: 2, Количество строк: 1

Таким образом, основываясь на критериях Z=3, то есть подсчитайте каждую 3-ю строку, чтобы рассмотреть строкиявляются line number 3, 6, 9.Также в этих строках нам нужно сосчитать Y=3 i.e. every 3rd word.Таким образом, следует учитывать следующие слова: "forty, it" from line 3, "leash, cats, Collins" from line 6 и "I" from line 9.Учитывая этот критерий, совпадающие слова с 2 или более гласными находятся только в строке 6 со словами "leash" и "Collins", поэтому на выходе получается WordCount = 2 и LineCount = 1.

Это мой первый разписать что-нибудь на Python, поэтому написал основной код ниже:

class StringCount:  #Count the number of words & lines that have more than X vowels for every Y words in every Z line. 

    lines = list();
    totalMatchedLines = 0;
    totalMatchedWords = 0;
    matchedChars = 0;

    def __init__(self, inputString, vowelCount, skipWords, skipLines, wordDelimiter, lineDelimiter):
      self.inputString = inputString;
      self.vowelCount = vowelCount;
      self.skipWords = skipWords;
      self.skipLines = skipLines;
      self.wordDelimiter = wordDelimiter;

    def splitLines(self):
      if self.inputString.strip() == "":
        print ("Please enter a valid string!");
        return False;      
      self.lines = self.inputString.splitlines();

    def splitWords(self):      
      self.matchedWords = 0;
      self.matchedLines = 0;
      self.linesLength = len(self.lines);

      if self.linesLength < self.skipLines:
        print ("Input string should be greater than {0}" .format(self.skipLines));
        return False;

      lineCount = self.skipLines - 1;
      wordCount = self.skipWords - 1;
      lineInUse = "";
      words = list();

      while (lineCount < self.linesLength):
        self.matchedWords = 0;
        self.matchedLines = 0;
        self.words = self.lines[lineCount].split();
        self.wordsLength = len(self.words);
        wordCount = self.skipWords - 1;

        while (wordCount < self.wordsLength):
          self.matchedChars = 0;       
          for i in self.words[wordCount].lower():
            if(i=='a' or i=='e' or i=='i' or i=='o' or i=='u'):
              self.matchedChars += 1;              
          if self.matchedChars >= self.vowelCount:
            self.matchedWords += 1;
          wordCount += self.skipWords;

        if self.matchedWords > 0:
          self.matchedLines += 1;

        self.totalMatchedWords += self.matchedWords;
        self.totalMatchedLines += self.matchedLines;
        lineCount += self.skipLines;

      print ("WordCount = %s" % (self.totalMatchedWords));
      print ("LineCount = %s" % (self.totalMatchedLines));

Так как это мой первый код на Python, я хотел проверить, как оптимизировать этот код как в производительности, так и в оптимизации строк.Есть ли уловки, чтобы сократить кратные циклы while и цикл for?

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 25 мая 2019

Это может быть намного эффективнее с таблицей перевода.Если вы преобразуете все гласные в каждом слове в букву «а», вы можете использовать метод count () для подсчета гласных.Остальное - это просто просмотр списка строк и слов, которые вы можете сделать с помощью списочных представлений и индексации диапазона:

vowels     = str.maketrans("aeiouAEIOU","aaaaaaaaaa")
X,Y,Z      = 2,3,3
counts     = [sum(word.translate(vowels).count("a")>=X for word in line.split(" ")[::Y]) for line in lines[Z-1::Z]]
lineCount  = sum(count>0 for count in counts)
wordCount  = sum(counts)

print(lineCount,wordCount) # 1 2
...