如何检查字符串的索引是否在多个范围内?

时间:2020-10-18 15:04:57

标签: python

我想创建一个函数来计算字符串中多个范围内的字符数。假设有效字符为:

  • 'a''f'之间
  • '1''3'之间
  • 逗号','

如果该函数被称为NumInRange(s),这就是我期望从代码中得到的结果。字符a1d,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 个答案:

答案 0 :(得分:7)

  • 无需转换为intord,直接比较字符串即可。
  • 您在循环内使用count实例化了0,所以即使代码工作正常,您也总是会得到01
def NumInRange(s):
    count = 0
    for c in s:
        if 'a' <= c <= 'e' or '1' <= c <= '3' or c == ',':
            count += 1
    return count

由于布尔值子类int的事实,使用generator expression可以使它成为一个很好的单行代码:

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