Как проверить, находится ли индекс строки в нескольких диапазонах?

#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))