Подтвердить что ты не робот

Как подсчитать количество букв в строке без пробелов?

Это мое решение, которое приводит к ошибке. Возвращает 0

PS: Мне все равно понравилось бы исправление для моего кода:)

from collections import Counter
import string


def count_letters(word):
    global count
    wordsList = string.split(word)
    count = Counter()
    for words in wordsList:
        for letters in set(words):
            return count[letters]

word = "The grey old fox is an idiot"
print count_letters(word)
4b9b3361

Ответ 1

def count_letters(word):
    return len(word) - word.count(' ')

В качестве альтернативы, если у вас есть несколько букв для игнорирования, вы можете отфильтровать строку:

def count_letters(word):
    BAD_LETTERS = " "
    return len([letter for letter in word if letter not in BAD_LETTERS])

Ответ 2

Простое решение с помощью функции sum:

sum(c != ' ' for c in word)

Это эффективное решение для памяти, потому что оно использует generator вместо создания временного списка, а затем вычисляет его сумму.

Стоит отметить, что c != ' ' возвращает True or False, что является значением типа bool, но bool является подтипом int, поэтому вы можете суммировать значения bool (True соответствует до 1 и False соответствует 0)

С помощью метода mro вы можете проверить, что происходит:

>>> bool.mro() # Method Resolution Order
[<type 'bool'>, <type 'int'>, <type 'object'>]

Здесь вы видите, что bool является подтипом int, который является подтипом object.

Ответ 3

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

from collections import Counter
import string

def count_letters(word, valid_letters=string.ascii_letters):
    count = Counter(word) # this counts all the letters, including invalid ones
    return sum(count[letter] for letter in valid_letters) # add up valid letters

Пример вывода:

>>> count_letters("The grey old fox is an idiot.") # the period will be ignored
22

Ответ 4

ОК, если это то, что вы хотите, вот что я сделал бы, чтобы исправить существующий код:

from collections import Counter

def count_letters(words):
    counter = Counter()
    for word in words.split():
        counter.update(word)
    return sum(counter.itervalues())

words = "The grey old fox is an idiot"
print count_letters(words)  # 22

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

Ответ 5

Для другого однострочного решения:

def count_letters(word):  return len(filter(lambda x: x not in " ", word))

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

>>> count_letters("This is a test")
11

Вы можете легко расширить это, чтобы исключить любой выбор символов, которые вам нравятся:

def count_letters(word, exclude):  return len(filter(lambda x: x not in exclude, word))

>>> count_letters ("This is a test", "aeiou ")
7

Изменить: Однако вы хотели, чтобы ваш собственный код работал, поэтому вот несколько мыслей. Первая проблема заключается в том, что вы не устанавливали список объектов Counter для подсчета. Однако, поскольку вы ищете общее количество букв, вам нужно снова присоединиться к словам, а не считать каждое слово индивидуально. Циклирование для добавления количества каждой буквы не является действительно необходимым, потому что вы можете вывести список значений и использовать "sum" для их добавления.

Вот версия, которая как можно ближе к вашему коду, без него:

from collections import Counter
import string

def count_letters(word):
   wordsList = string.split(word)
   count = Counter("".join(wordsList))
   return sum(dict(count).values())

word = "The grey old fox is an idiot"
print count_letters(word)

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

Например, я мог бы написать

joined_words = []
for curr_word in wordsList:
    joined_words.extend(curr_word)
count = Counter(joined_words)

но при этом я завершаю выделение дополнительного массива и выполнение цикла через интерпретатор Python, что мое решение:

count = Counter("".join(wordsList))

будет выполняться в куске оптимизированного, скомпилированного кода C. Мое решение - это не единственный способ упростить этот цикл, но это в одну сторону.

Ответ 6

Мне удалось сконденсировать его на две строки кода:

string = input("Enter your string\n")
print(len(string) - string.count(" "))

Ответ 7

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

import re
s = 'The grey old fox is an idiot'
count = len(re.findall('[a-zA-Z]',s))

Ответ 8

Я нашел, что это прекрасно работает

str = "count a character occurance"
str = str.replace(' ', '')
print (str)
print (len(str))

Ответ 9

def count_letter(string):
    count = 0
    for i in range(len(string)):
        if string[i].isalpha():
            count += 1
    return count


print(count_letter('The grey old fox is an idiot.'))

Ответ 10

n=str(input("Enter word: ").replace(" ",""))

ans=0
for i in n:
    ans=ans+1
print(ans)    

Ответ 11

word_display = ""
for letter in word:
    if letter in known:
        word_display = "%s%s " % (word_display, letter)
    else:
        word_display = "%s_ " % word_display
return word_display

Ответ 12

Попробуйте использовать...

resp = input("Hello, I am stuck in doors! What is the weather outside?")
print("You answered in", resp.ascii_letters, "letters!")

Не работал у меня, но должен работать для некоторых случайных парней.