For counting integers only, you can use a simple regular expression:
import re
s = '2019 was a great year for 10 fortunate people in ages 20 to 60.'
n = len(re.findall(r'd+', s)) # 4
Here 'd+'
means “one or more decimal characters in a row”.
Note that re.findall
produces a list
of the results. If you only care about the number of elements (n
), this is wasteful for input strings containing very many numbers. Instead, make use of an iterator approach, e.g.
import re
s = '2019 was a great year for 10 fortunate people in ages 20 to 60.'
n = sum(1 for _ in re.finditer(r'd+', s)) # 4
Incorporating floats
Let’s say that you allow float
s like 1.2
and 3e-4
etc. as well. The corresponding regular expression is now much more complicated, and an easier solution would be to just loop over all “words” in the string and check if they can be interpreted as a number:
def is_number(num):
try:
float(num)
except:
return False
return True
s = '2019 was a great year for 10 fortunate people in ages 20 to 60.'
n = sum(1 for num in s.split() if is_number(num)) # 4
Ignoring anything else that may or may not be correct with your “revised code”, the issue causing the error currently quoted in your question is caused by calling the “count” function with an undefined variable because your didn’t quote the string.
count(thisisastring222)
looks for a variable called thisisastring222 to pass to the function called count. For this to work you would have to have defined the variable earlier (e.g. withthisisastring222 = "AStringWith1NumberInIt."
) then your function will do what you want with the contents of the value stored in the variable, not the name of the variable.count("thisisastring222")
hardcodes the string “thisisastring222” into the call, meaning that the count function will work with the exact string passed to it.
To fix your call to your function, just add quotes around asdfkasdflasdfl222
changing count(asdfkasdflasdfl222)
to count("asdfkasdflasdfl222")
.
As far as the actual question “How to count digits, letters, spaces for a string in Python”, at a glance the rest of the “revised code” looks OK except that the return line is not returning the same variables you’ve used in the rest of the code.
To fix it without changing anything else in the code, change number
and word
to digit
and letters
, making return number,word,space,other
into return digit,letters,space,other
, or better yet return (digit, letters, space, other)
to match current behavior while also using better coding style and being explicit as to what type of value is returned (in this case, a tuple).
На Python можно использовать функцию isdigit() из модуля string для проверки, является ли символ цифрой, и функцию sum() для подсчета количества цифр в строке.
Пример:
import string
def count_digits(s):
return sum(c.isdigit() for c in s)
s = ‘Hello, world! 123’
print(count_digits(s)) # Output: 3
В этом примере функция count_digits() принимает строку s и возвращает количество цифр в этой строке.
Естественно, этот метод можно расширить или модифицировать в зависимости от ваших потребностей. Например, если вам нужно подсчитать количество конкретной цифры в строке, вы можете использовать метод count() строки.
s = ‘Hello, world! 123’
print(s.count(‘1’)) # Output: 1
Если вам нужно подсчитать количество цифр в нескольких строках, вы можете использовать цикл for и вызывать функцию count_digits() для каждой строки:
strings = [‘Hello, world!’, ‘abc123’, ‘123abc’]
for s in strings:
print(count_digits(s))
Вывод:
3
3
3
Вы можете использовать эти методы или модифицировать их для решения своей задачи.
В этой статье мы рассмотрим, как определить количество чисел в строке, используя различные методы, а также приведем примеры кода для каждого из них.
1. Метод split() и функция str.isdigit()
Один из способов определить количество чисел в строке – использовать метод split()
для разделения строки на список слов, а затем применить функцию str.isdigit()
для проверки, является ли слово числом.
Пример:
def count_numbers_in_string(s): words = s.split() count = 0 for word in words: if word.isdigit(): count += 1 return count s = "123 яблоко 45 груша 6789 банан 10" print(count_numbers_in_string(s)) #4
2. Регулярные выражения
Регулярные выражения являются мощным инструментом для поиска и работы со строками. В данном случае мы можем использовать модуль re
для поиска всех чисел в строке.
Пример:
import re def count_numbers_in_string(s): numbers = re.findall(r'd+', s) return len(numbers) s = "123 яблоко 45 груша 6789 банан 10" print(count_numbers_in_string(s)) #4
3. Использование метода str.split() с регулярными выражениями
Мы можем также использовать комбинацию метода split()
и регулярных выражений для разделения строки на список чисел и подсчета их количества.
Пример:
import re def count_numbers_in_string(s): words = re.split(r'D+', s) count = 0 for word in words: if word: count += 1 return count s = "123 яблоко 45 груша 6789 банан 10" print(count_numbers_in_string(s)) #4
4. Использование списковых включений (list comprehensions)
Списковые включения – это элегантный способ создания списков на основе существующих коллекций. В данном случае мы можем использовать списковые включения для создания списка чисел и подсчета их количества.
Пример:
def count_numbers_in_string(s): words = s.split() numbers = [word for word in words if word.isdigit()] return len(numbers) s = "123 яблоко 45 груша 6789 банан 10" print(count_numbers_in_string(s)) #4
Заключение
Каждый из представленных методов имеет свои преимущества и недостатки. Метод split()
и функция str.isdigit()
являются простыми и понятными, но могут быть менее гибкими при работе с разными форматами чисел. Регулярные выражения предлагают больше возможностей для поиска и обработки чисел, однако могут быть сложными для понимания и избыточными для простых задач. Списковые включения являются компактными и эффективными, но могут быть менее читаемыми для новичков.
Выбирая подходящий метод, стоит учитывать характеристики исходных данных, а также личные предпочтения и опыт работы с Python. В любом случае, знание различных методов работы со строками и числами позволяет более гибко и эффективно решать задачи на Python.
SkyFanGT 0 / 0 / 0 Регистрация: 21.11.2016 Сообщений: 20 |
||||
1 |
||||
Подсчитать количество чисел в тексте18.12.2016, 14:01. Показов 48258. Ответов 8 Метки нет (Все метки)
Всем привет, решал задачку в пайтоне и столкнулся с проблемной – незнаю как реализовать б-в пункты задания. С клавиатуры вводиться строка текста, написать програму которая для этой строки: Пол интернета перерыл, и книжки которые были по пайтону, не подсказали как решать. П.С вот кусочек программы. Пункт А.
0 |
Ennjin 103 / 81 / 54 Регистрация: 25.11.2016 Сообщений: 278 |
||||
18.12.2016, 14:32 |
2 |
|||
б) подсчитывает количество цифр в тексте;
1 |
0 / 0 / 0 Регистрация: 21.11.2016 Сообщений: 20 |
|
18.12.2016, 14:46 [ТС] |
3 |
Спасибо)Интересная для меня функция) Всё работает.
0 |
Ennjin 103 / 81 / 54 Регистрация: 25.11.2016 Сообщений: 278 |
||||||||
18.12.2016, 14:54 |
4 |
|||||||
Как то так.
1 |
0 / 0 / 0 Регистрация: 21.11.2016 Сообщений: 20 |
|
18.12.2016, 15:05 [ТС] |
5 |
У мене почему то удаляет не последнее число а все цифры(
0 |
Ennjin 103 / 81 / 54 Регистрация: 25.11.2016 Сообщений: 278 |
||||
18.12.2016, 16:01 |
6 |
|||
В чём косяк? Во мне. потому что я поторопился и неправильно сделал.
Вот рабочий код, но это “говнокод”. Потому что я сам новичок и не знаю как сделать правильно.
1 |
Garry Galler 5407 / 3831 / 1214 Регистрация: 28.10.2013 Сообщений: 9,554 Записей в блоге: 1 |
||||
18.12.2016, 18:05 |
7 |
|||
Если все объединить, то получим такой код:
PS: Понятно, что регулярными выражениями будет, наверно, короче, но я так понимаю, что надо было обойтись обычными методами….
1 |
Semen-Semenich 4611 / 3148 / 1112 Регистрация: 21.03.2016 Сообщений: 7,838 |
||||
18.12.2016, 19:53 |
8 |
|||
Сообщение было отмечено SkyFanGT как решение Решение
Если все объединить, то получим такой код меня смущает эти два задания Добавлено через 7 минут
если конечно в строке текста числа и слова разделены пробелом
1 |
0 / 0 / 0 Регистрация: 21.11.2016 Сообщений: 20 |
|
19.12.2016, 02:04 [ТС] |
9 |
Спасибо, с индексом хорошо придумано) я бы не догадался. ОЧЕНЬ ВАМ БЛАГОДАРЕН!
0 |