2013-09-27 3 views
0
def file(char, filename): 
    for currentFile in filename: 
     print(currentFile.strip()) 

def string(char, str): 
    count = 0 
    if char in 'abcdefghijklmnopqrstuvwxyz': 
     count += 1 
     string(char,str) 
    else: 
     print("Incorrect Letters") 
    print(count) 

def main(): 
    char = input("Enter character: ") 
    openFile = input("Enter the filename: ") 

    filename = open(openFile) 

    file(char, filename) 
    string(char, str) 

main() 

Я пытаюсь подсчитать определенный символ, например, если бы я должен был ввести «W» в приглашении ввода char, он должен был бы считать только W. Как я могу это сделать? Я пытаюсь выполнить рекурсию в функции def stringPython Count Some Character

Спасибо.

+3

взглянуть на это http://stackoverflow.com/questions/1155617/count-occurrence-of-a-character-in-a-python -string –

+4

как 'file', так и' string' уже существуют в python, поэтому не используйте те, что мне это имена. –

+0

Поскольку у вас нет переменной 'str', эта строка:' string (char, str) 'не будет работать. –

ответ

1

Эта проблема проще/эффективнее решить с помощью цикла, но если вы действительно, действительно хотите написать рекурсивную решение, давайте посмотрим, как это сделать. Первый пример, как подсчитать количество строчных букв в строке (это правильная реализация вашей string() функции):

import string 

def countString(strg): 
    if not strg:        # if it's the empty string 
     return 0        # then it has 0 letters 
    elif strg[0] in string.ascii_lowercase: # if the first char is a letter 
     return 1 + countString(strg[1:])  # add 1 and continue with recursion 
    else:         # if the first char is not a letter 
     raise Exception, 'Incorrect Letters' # then throw an exception 

countString('abcd') 
=> 4 

countString('ab$cd') 
=> Exception: Incorrect Letters 

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

Второй пример, как подсчитать количество вхождений символа в строке (это отвечает на вопрос в названии), он похож на предыдущий пример, но он рассчитывает только символ, передаваемый в качестве параметра:

def countChar(strg, ch): 
    if not strg:       # if it's the empty string 
     return 0       # then ch's count is 0 
    elif strg[0] == ch:     # if the first char is ch 
     return 1 + countChar(strg[1:], ch) # add 1 and continue with recursion 
    else:         # if the first char is not ch 
     return countChar(strg[1:], ch)  # simply continue with recursion 

countChar('abcdeabca', 'a') 
=> 3 

countChar('abcdeabca', 'x') 
=> 0 
0

Я предлагаю вам взять файл или любую строку в виде строковой переменной, а затем перейти с помощью цикла for по отдельным элементам строки и сравнить каждый символ с символом, считанным и считанным + = 1.

0

Как насчет использования модуля регулярных выражений?

import re 
len(re.findall('W','fasrWfdsfWfsW')) 

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

1

Это решение без рекурсии и регулярных выражений, просто используя встроенные модули.

import sys 

char = raw_input("Enter character: ") 
# 'isalpha' does the same as your manual check and is more idiomatic 
if not char.isalpha(): 
    print "Incorrect letters" 
    # This will terminate the script 
    sys.exit() 


fname = raw_input("Enter filename: ") 

count = 0 

# We use a context manager to open a file, this way we don't 
# have to close it ourselves when we're done. This is the idiomatic 
# way to open files in Python since context managers were introduced. 
with open(fname, 'r') as fp: 
    # We go through the file line by line 
    for line in fp: 
     # We can use the built-in 'count' method to count 
     # the occurences of a character in a string 
     # Use 'line.lower().count(char)' if you want to be case-insensitive 
     count += line.count(char) 

print count 
+0

в «с открытым (fname, r ') как fp .. «Что такое« r »? – Singh2013

+0

-1 потому что, хотя он правильный, он не отвечает требованиям, которые должны объяснять концепцию рекурсии в ОП, чтобы он мог завершить свое задание. –

0

Используйте встроенную функцию подсчета:

l = 'abcdeabca' 
l.count('a') 

3