Словарь с итерациями - PullRequest
0 голосов
/ 14 июля 2020

Я должен создать функцию, которая выполняет итерацию по строке и составляет словарь типов символов внутри нее. Например, {upper : 3, lower: 3, spaces :2}. Я могу создавать ключи, но не могу их правильно сосчитать. Это строки, которые мне нужно использовать:

print(count_types("aabbccc"))
print(count_types("ABC 123 doe ray me!"))

Ответы [ 3 ]

5 голосов
/ 14 июля 2020

Простой подход

from collections import defaultdict


def count_types(string):
    types = defaultdict(int)
    for char in string:
        if char.islower():
            types['lower'] += 1
        elif char.isupper():
            types['upper'] += 1
        elif char.isspace():
            types['space'] += 1
        elif char.isdigit():
            types['digit'] += 1
    return types

            
print(count_types("ABC 123 doe ray me!"))

Результат:

{'upper': 3, 'spaces': 4, 'lower': 8}

Подход Counter

from collections import Counter
import string


FIELD_NAMES = {
    **{char: 'lower' for char in string.ascii_lowercase},
    **{char: 'upper' for char in string.ascii_uppercase},
    **{char: 'space' for char in string.whitespace},
    **{char: 'digit' for char in string.digits},
}


def count_types(string):
    types = Counter(map(FIELD_NAMES.get, string))
    del types[None]
    return types
1 голос
/ 14 июля 2020

Вот способ использования Counter:

from collections import Counter
import string


def classify(char):
    for func, char_type in [(str.isupper, 'upper'),
                            (str.islower, 'lower'),
                            (str.isspace, 'space'),
                            (str.isdigit, 'digit'),
                            (lambda c: c in string.punctuation, 'punctuation')
                            ]:
        if func(char):
            return char_type

    return 'unknown'


def count_types(input_string):
    return Counter((classify(char) for char in input_string))

print(count_types("aabbccc"))
Counter({'lower': 7})
print(count_types("ABC 123 doe ray me!"))
Counter({'lower': 8, 'space': 4, 'upper': 3, 'digit': 3, 'punctuation': 1})
1 голос
/ 14 июля 2020

Я хотел бы дополнить отличный ответ @ Infinity этим примером, основанным на re:

import re
from collections import defaultdict


s = 'ABC 123 doe ray me!'
res = defaultdict(int)
res['upper'] = len(re.findall(r'[A-Z]', s))
res['lower'] = len(re.findall(r'[a-z]', s))
res['spaces'] = len(re.findall(r' ', s))
res['digits'] = len(re.findall(r'\d', s))
print(res)

Отредактировано:

Также я написал такой компактный творческий код с itertools.starmap:

import re
from itertools import starmap

s = 'ABC 123 doe ray me!'
counts = starmap(lambda pattern: len(re.findall(pattern, s)),
                 ((r'[A-Z]',), (r'[a-z]',), (r' ',), (r'\d',)))
res = {}
res['upper'], res['lower'], res['spaces'], res['digits'] = counts
print(res)

Может быть, кому-то это покажется интересным (или слишком нечитаемым).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...