Программа частотного анализа в python - PullRequest
1 голос
/ 24 апреля 2020

Я новичок в python программировании. и теперь в части программы я хочу определить класс для частотного анализа и распечатать его в красивом стиле:

Letter    Occurrence    Percentage
  a          12            4.12%
  b          7             3.15%
  c          21            7.67%
 ...        ...             ...

вот мой код:

class Analysis():

    def __init__(self, sentence, freq_dict = {}):
        self.sentence = sentence
        self.freq_dict = freq_dict

    @property
    def frequency(self):
        print("\t\tLetter\t\tOccurrence\t\tPrecentage")
        for letter, occurrence in enumerate(self.freq_dict):
            return f"\t\t{letter}\t\t{occurrence}\t\t{round(occurrence*100/len(sentence), 2)}%"

    @frequency.setter
    def frequency(self, sentence):
        self.sentence = sentence
        for letter in sentence:
            freq_dict[letter] = self.sentence.count(letter)
        return freq_dict


sentence = input("please enter your sentence: ").lower()
object = Analysis(sentence)
print(object.frequency())

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

возможно, оно может быть короче или изменить некоторые строки. (вместо словаря, возможно, я могу использовать collection.Counter (предложение), он возвращает кортеж).

1 Ответ

3 голосов
/ 24 апреля 2020

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

1- чтобы определить функцию ввода внутри класса (не как глобальную переменную), вы можете определить метод класса с именем get_sentence

2 - Вы можете использовать Counter () из модуля коллекций, чтобы составить словарь букв и их вхождений. чтобы извлечь и распечатать результат, вы можете определить extract() метод экземпляра.

(результат будет отсортирован по наибольшему вхождению по наименьшему.)

код будет быть таким:

from collections import Counter

class Analysis():

    def __init__(self, sentence):
        self.sentence = sentence

    def extract(self):
        print("\n\t\tLetter\t\tOccurrence\t\tPrecentage")
        print(f"\t\t {'-' * 39}")
        sorted_f = sorted(Counter(self.sentence).items(), key = lambda kv: kv[1], reverse=True)
        for letter, occurrence in sorted_f:
            print(f"\t\t  {letter}\t\t\t    {occurrence}\t\t\t  {round(occurrence * 100 / len(self.sentence), 2)}%")
        return " "

    @classmethod
    def get_sentence(cls):
        sentence = input("Enter your sentence: ").lower().replace(" ", "")
        return cls(sentence)

obj = Analysis.get_sentence()
obj.extract()

ВЫХОД:

      Letter      Occurrence      Precentage
      ---------------------------------------
        e             5             21.74%
        n             4             17.39%
        s             3             13.04%
        t             3             13.04%
        i             2             8.7%
        o             1             4.35%
        m             1             4.35%
        c             1             4.35%
        h             1             4.35%
        p             1             4.35%
        u             1             4.35%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...