Как подсчитать количество букв в строке без пробелов?
Это мое решение, которое приводит к ошибке. Возвращает 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)
Ответы
Ответ 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!")
Не работал у меня, но должен работать для некоторых случайных парней.