Подсчет количества символов алфавита в строке - PullRequest
1 голос
/ 21 июня 2019

Я бы хотел посчитать, сколько символов алфавита [a ... z] в строке, меня не волнует "!"или же "?"или "\ n", ",", "."и много других.Я просто хочу буквы алфавита.

Я пытался использовать collection.Counter (строка), но проблема в том, что Counter получает эти нежелательные символы, и я не знаю, как их отменить.

И еще одна проблема в моей настоящей идиоме - мы используем не только «о», но и «о» и «ó», а также «е», «é» или «ç».В этих случаях эти символы должны быть рассмотрены.

Как я могу это сделать?

Ответы [ 4 ]

1 голос
/ 21 июня 2019

Если вы хотите считать только уникальные символы, вы можете использовать set.intersection между набором символов в вашей строке и набором символов, которые вы принимаете:

может быть что-то вроде этого:

import string

acceptable_chars = set('áàéíóúç').union(set(string.ascii_lowercase))
mystring = 'kfh;l1234sóúçids'
num_alpha = len(set(mystring.lower()).intersection(acceptable_chars))
print(num_alpha)

вывод:

10
1 голос
/ 21 июня 2019

Удалите не-буквы после использования collections.Counter.

import collections
import string

counter = collections.Counter(yourString)
for char in counter.keys():
    if not isalpha(char):
        del counter[char]

Это будет противопоставлять прописные и строчные буквы отдельно, а также буквы, которые имеют разные акценты и диакритические знаки.Если вы хотите игнорировать регистр, вы можете использовать collections.Counter(yourString.lower()).Если вы также хотите игнорировать диакритические знаки, используйте collections.Counter(yourString.encode('ascii', 'ignore').decode().lower())

0 голосов
/ 21 июня 2019

Итак, ребята!

Я пометил ответ Маски Реблохона как правильный, потому что я думал, что был прав.Но после теста чуть больше я обнаружил, что был неправ.Поэтому я сделал свое собственное решение на основе его кода.

Проблема с этим кодом в том, что если моя строка "kfh; l1234sóúçids", как в его примере, вывод правильный, 10. Но если я повторю ее с пробелами, например: "kfh; l1234sóúçids kfh; l1234sóúçids" Я снова получаю 10 и должен быть 20.

Итак, мое решение - создать набор приемлемых символов, таких как его код, и использовать его в качестве ссылки.

Здесь: (В моем случае вывод равен 11, потому что я добавил еще несколько специальных символов в набор.

import collections
import string

# This counter is considering only acceptable_chars. All the rest is ignored.
def numChars(sentence):
    acceptable_chars = set('áàéíóúç').union(set(string.ascii_lowercase))
    chars = collections.Counter(sentence)
    acum = 0

    for key in acceptable_chars:
        if key in chars:
            acum += chars[key]

    return acum


x = numChars("kfh;l1234sóúçids")
print("Acum: " + str(x))

Вывод:

Acum: 11

Если строка 'kfh; l1234sóúçids \ n kfh; l1234sóúçids ':

Acum: 22
0 голосов
/ 21 июня 2019

Дано

import string
import collections as ct


s = "Lorem ipsum çéó?"

Код

Создайте набор из accepted символов - исключите то, что вам не нужно;включите то, что вы хотите.

excluded = set("oe")
included = set("ôóéç")
accepted = set(string.ascii_letters) - excluded | included 

Подсчитайте и замаскируйте принятые символы.

counted = ct.Counter(s)
masked = ct.Counter(accepted)
shared = set((counted & masked).elements())

Отфильтруйте принятые символы из счетчика.

Демо

Сумма символов

sum(v for k, v in counted.items() if k in shared)
# 11

Сумма уникальных символов

sum(1 for k, _ in counted.items() if k in shared)
# 10

Dict из подсчитанных символов

{k: v for k, v in counted.items() if k in shared}
# {'L': 1, 'r': 1, 'm': 2, 'i': 1, 'p': 1, 's': 1, 'u': 1, 'ç': 1, 'é': 1, 'ó': 1}
...