считать символы строки с помощью функции - PullRequest
0 голосов
/ 21 ноября 2019

Напишите функцию с именем count_letters, которая принимает в качестве параметра строку и возвращает словарь, в котором указывается, сколько каждой буквы содержится в этой строке. Строка может содержать символы, отличные от букв, но должны учитываться только буквы. Строка может даже быть пустой строкой. Варианты буквы в нижнем и верхнем регистре должны быть частью одного и того же числа. Ключи словаря должны быть заглавными буквами. Если буква не появится в строке, она не будет добавлена ​​в словарь. Например, если строка

"AaBb"

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

{'A': 2, 'B': 2}
def count_letters(string):
    """counts all the letters in a given string"""
    your_dict = dict()
    for x in string:
        x = x.upper()  # makes lowercase upper
        if x not in your_dict:
            your_dict[x]= 1
        else:
            your_dict[x] += 1
    return your_dict

При полученииперейти к загрузке:

Test Failed: {'Q': 1, 'U': 3, 'I': 3, 'S': 6, ' ': 3, 'C[48 chars]': 1} != {'S': 6, 'U': 3, 'I': 3, 'T': 3, 'O': 3, 'C[32 chars]': 1}
+ {'C': 2, 'D': 2, 'E': 2, 'I': 3, 'O': 3, 'P': 1, 'Q': 1, 'S': 6, 'T': 3, 'U': 3}
- {' ': 3,
-  '?': 1,
-  'C': 2,
-  'D': 2,
-  'E': 2,
-  'I': 3,
-  'O': 3,
-  'P': 1,
-  'Q': 1,
-  'S': 6,
-  'T': 3,
-  'U': 3}

Ответы [ 2 ]

0 голосов
/ 21 ноября 2019

Это решение использует , использует collections, но в отличие от Counter мы не получаем полное решение из одной библиотечной функции. Я надеюсь, что это разрешено, а если нет, то оно будет, по крайней мере, каким-то информативным.

import collections as colls

def count_letters(str_in):
    str_folded = str_in.casefold()
    counts = colls.defaultdict(int)
    for curr_char in str_folded:
        counts[curr_char] += 1
    return counts

defaultdict чрезвычайно практично. Как видно из названия, когда мы пытаемся проиндексировать словарь с ключом, который не существует, он создает значение по умолчанию для этого ключа и выполняет нашу первоначальную операцию. В этом случае, поскольку мы объявляем, что наш defaultdict будет использовать целые числа для своих ключей, значение по умолчанию равно 0.

str.casefold() - это метод, разработанный специально для сложной проблемы, котораярегистронезависимое сравнение. Хотя вряд ли это что-то изменит здесь, полезно знать об этом.

Дайте мне знать, если у вас есть какие-либо вопросы:)

0 голосов
/ 21 ноября 2019

Без использования collections, вот решение:

def count_letters(string):
    string = string.upper()
    counts = {}
    for a in set(string):
        counts[a] = string.count(a)
    return counts

Эта функция перебирает set(string), что равно всем буквам, используемым в вашем слове, без дубликатов и в верхнем регистре. Затем он подсчитывает, сколько раз каждая буква появляется в вашей строке, и добавляет ее в ваш counts словарь.

Надеюсь, это ответит на ваш вопрос. :)

...