Как рассчитать конкретный символ, который окружен случайными буквами - PullRequest
1 голос
/ 17 мая 2019

Я пытаюсь подсчитать знаки препинания: апостроф (') и дефис (-), используя словари.Я хочу посмотреть, смогу ли я справиться с этим, используя список / словарь / для циклов и логических выражений.Эти знаки пунктуации ДОЛЖНЫ БЫТЬ СЧЕТЫ, только если они окружены любыми другими буквами!Например, домкрат в коробке (то есть 3 дефиса) и не должен (1 апостроф).Эти буквы могут быть любыми от a до z.Кроме того, поскольку это является частью назначения, никакие модули / библиотеки не могут быть использованы.У меня нет идей, и я не знаю, что делать.Любая помощь будет принята с благодарностью.

Это то, что я пытался: но я получаю KeyError: 0

def countpunc2():
filename = input("Name of file? ")
text = open(filename, "r").read()
text = text.lower()  #make all the words lowercase (for our convenience)
for ch in '!"#$%&()*+./:<=>?@[\\]^_`{|}~':
    text = text.replace(ch, ' ')
for ch in '--':
    text = text.replace(ch, ' ')
words = text.split('\n')       #splitting the text for words
wordlist = str(words)
count = {}                 #create dictionary; the keys/values are added on
punctuations = ",;'-"
letters = "abcdefghijklmnopqrstuvwxyz"
for i, char in enumerate(wordlist):
    if i < 1:
        continue
    if i > len(wordlist) - 2:
        continue
    if char in punctuations:
        if char not in count:
            count[char] = 0
        if count[i-1] in letters and count[i+1] in letters:
            count[char] += 1
print(count)

ОБНОВЛЕНИЕ: Я изменил код на:

def countpunc2():
filename = input("Name of file? ")
text = open(filename, "r").read()
text = text.lower()  #make all the words lowercase (for our convenience)
for ch in '!"#$%&()*+./:<=>?@[\\]^_`{|}~':
    text = text.replace(ch, ' ')
for ch in '--':
    text = text.replace(ch, ' ')
words = text.split('\n')       #splitting the text for words
wordlist = str(words)
count = {}                 #create dictionary; the keys/values are added on
punctuations = ",;'-"
letters = "abcdefghijklmnopqrstuvwxyz"
for i, char in enumerate(wordlist):
    if i < 1:
        continue
    if i > len(wordlist) - 2:
        continue
    if char in punctuations:
        if char not in count:
            count[char] = 0
        if wordlist[i-1] in letters and wordlist[i+1] in letters:
            count[char] += 1
print(count)

Пока он дает мне вывод, это не правильно.Пример файла: https://www.dropbox.com/s/kqwvudflxnmldqr/sample1.txt?dl=0 Ожидаемые результаты должны быть: {',': 27, '-': 10, ';': 5, "'": 1}

Ответы [ 3 ]

0 голосов
/ 17 мая 2019

Вот пример, который делает это очень четко:

end_cap_characters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
special_characters = [";", ":", "'", "-", ","]

def count_special_characters(in_string):
    result = {}
    for i in range(1, len(in_string) - 1):
        if in_string[i - 1] in end_cap_characters:
            if in_string[i + 1] in end_cap_characters:
                if in_string[i] in special_characters:
                    if in_string[i] not in result:
                        result[in_string[i]] = 1
                    else:
                        result[in_string[i]] +=1
    return result

print(count_special_characters("jack-in-the-box"))
print(count_special_characters("shouldn't"))
print(count_special_characters("jack-in-the-box, shouldn't and a comma that works,is that one"))

Выход:

{'-': 3}
{"'": 1}
{'-': 3, "'": 1, ',': 1}

Очевидно, что это может быть сжато, но я оставлю это как упражнение для вас;).

Обновление

Исходя из вашего отредактированного вопроса и отправленного кода, вам необходимо обновить строку:

if count[i-1] in letters and count[i+1] in letters:

до:

if wordlist[i-1] in letters and wordlist[i+1] in letters:
0 голосов
/ 17 мая 2019

Я бы, наверное, все упростил.

#!/usr/bin/env python3
sample = "I'd rather take a day off, it's hard work sitting down and writing a code. It's amazin' how some people find this so easy. Bunch of know-it-alls."

punc = "!\"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~" 
letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

d = {}
for i, char in enumerate(sample):
    if i < 1:
        continue

    if i > len(sample) - 2:
        continue

    if char in punc:
        if char not in d:
            d[char] = 0

        if sample[i - 1] in letters and sample[i + 1] in letters:
            d[char] += 1

print(d)

Выход:

{"'": 3, ',': 0, '.': 0, '-': 2}

Не знаю, где вы получаете ";" от. Кроме того, рядом с вашей запятой есть пробел ... так что она не считается здесь ... если это значит, добавьте пробел к переменной букв.

Объяснение того, что происходит:

Мы начинаем диктовку и читаем образец текста как sample и повторяем его символ за символом, используя enumerate для игры с индексами. Если он слишком близок к концу или начинает готовиться, мы пропускаем его.

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

ПРИМЕЧАНИЕ: несмотря на шебанг, этот код работает в python2

0 голосов
/ 17 мая 2019

Вы можете отобразить символы входной строки в 3 категории: буквенные (а), знаки пунктуации (р) и пробелы (и). Затем сгруппируйте их в тройки (последовательности из 3 символов). Из них выделите тройки a-p-a и посчитайте количество различных знаков пунктуации.

например:

string="""jack-in-a-box (that is 3 hyphens) and shouldn't (1 apostrophe)."""

categ   = [ "pa"[c.isalpha()] if c != " " else "s" for c in string ]
triples = [ triple for triple   in zip(categ,categ[1:],categ[2:]) ]
pChars  = [ p      for p,triple in zip(s[1:],triples) if triple==("a","p","a") ]
result  = { p:pChars.count(p) for p in set(pChars) }

print(result) # {"'": 1, '-': 3}

Если вам не разрешено использовать isAlpha() или zip(), вы можете закодировать эквивалент с помощью оператора in и циклов for.

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