Как я могу улучшить этот алгоритм для подсчета частоты символов в строке? - PullRequest
0 голосов
/ 28 января 2020

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

Сначала я передаю строку в словарь, используя каждый символ в качестве ключа вместе с частотой его появления в качестве значения. После этого я преобразовал словарь в нисходящий отсортированный многомерный список.

Я хотел бы знать, как улучшить алгоритм, это был хороший подход? Можно ли это сделать по-другому? Все предложения приветствуются.

#Libraries
from operator import itemgetter
# START

# Function
# String to Dict. Value as freq. 
# of appearance and char as key.
def frequencyChar(string):
    #string = string.lower() # Optional
    freq = 0
    thisDict = {}
    for char in string:
        if char.isalpha(): # just chars
            freq = string.count(char)
            thisDict[char] = freq # {key:value}
    return(thisDict)

str2Dict = frequencyChar("Would you like to travel with me?")
#print(str2Dict)
# Dictionary to list
list_key_value = [[k,v] for k, v in str2Dict.items()]
# Descending sorted list
list_key_value = sorted(list_key_value, key=itemgetter(1), reverse=True)

print("\n", list_key_value, "\n")

#END

1 Ответ

0 голосов
/ 28 января 2020

Вы делаете способ слишком много работы. collections.Counter считает вещи автоматически и даже сортирует по частоте:

from collections import Counter
s = "Would you like to travel with me?"
freq = Counter(s)
# Counter({' ': 6, 'o': 3, 'l': 3, 'e': 3, 't': 3, 'u': 2, 'i': 2, 'W': 1, 'd': 1, 'y': 1, 'k': 1, 'r': 1, 'a': 1, 'v': 1, 'w': 1, 'h': 1, 'm': 1, '?': 1})

Если вы хотите удалить пробелы из подсчета:

del freq[' ']
# Counter({'o': 3, 'l': 3, 'e': 3, 't': 3, 'u': 2, 'i': 2, 'W': 1, 'd': 1, 'y': 1, 'k': 1, 'r': 1, 'a': 1, 'v': 1, 'w': 1, 'h': 1, 'm': 1, '?': 1})

Также, в общем, ваш Алгоритм делает слишком много работы. string.count включает в себя перебор всей строки для каждого символа, который вы пытаетесь посчитать. Вместо этого вы можете просто итерировать один раз по всей строке, и для каждой буквы вы просто продолжаете увеличивать ключ, связанный с этой буквой (инициализируйте его значением 1, если это буква, которую вы раньше не видели). По сути, это то, что Counter делает для вас.

Правописание:

count = {}
for letter in the_string:
    if not letter.isalpha():
        continue
    if letter not in count:
        count[letter] = 1
    else:
        count[letter] += 1

А затем для сортировки вам не нужно сначала преобразовывать в список, вы можете просто сделать это напрямую:

ordered = sorted(count.items(), key=itemgetter(1), reverse=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...