#python
#python
Вопрос:
Я хотел бы создать функцию, которая подсчитывает количество символов в строке, которые находятся в нескольких диапазонах. Допустим, допустимые символы:
- между
'a'
и'f'
- между
'1'
и'3'
- запятая
','
Если бы функция была вызвана NumInRange(s)
, это то, что я ожидал бы от кода. Символы a
, 1
, d
, ,
, и b
находятся в пределах диапазона, поэтому возвращают 5
:
>>> NumInRange("a14d8,b")
5
Мой код показан ниже:
def NumInRange(s):
for i in range(len(s)):
count=0
if (ord('a')<=ord(s[i])<=ord('e') or 1<=int(s[i])<=3 or ord(s[i])==ord(',')):
count=count 1
return count
Когда я попробовал свой код только с целым числом, он работает нормально, но когда я попробовал его с символами, появилось сообщение об ошибке
ValueError: invalid literal for int() with base 10: 'a'
Комментарии:
1. Функция int позволит вам вводить только числа. Он выдает ошибку при переборе строки, потому что он передает символ в функцию int.
2. если вам разрешено использовать регулярное выражение, вы можете использовать re.findall,
import re print(len(re.findall("[A-Fa-f1-3,]",your_string)))
Ответ №1:
- Нет необходимости преобразовывать в
int
илиord
, сравнивать строки напрямую. - Вы создали экземпляр
count
0
внутри цикла, поэтому, даже если код работал, вы всегда получали0
или1
.
def NumInRange(s):
count = 0
for c in s:
if 'a' <= c <= 'e' or '1' <= c <= '3' or c == ',':
count = 1
return count
Благодаря тому, что подкласс booleans int
, это может стать хорошим однострочным выражением с использованием выражения генератора:
def NumInRange(s):
return sum('a' <= c <= 'e' or '1' <= c <= '3' or c == ',' for c in s)
Также обратите внимание, что поскольку c
может быть только один символ (учитывая, что s
это строка), вы можете просто сделать (за счет «стоимости» «жесткого кодирования» диапазонов)
def NumInRange(s):
return sum(c in 'abcde123,' for c in s)
Другой, совершенно другой подход — это регулярное выражение:
import re
def NumInRange(s):
return len(re.findall('[a-e1-3,]', s))