首页 > 解决方案 > 如何检查字符串的索引是否在多个范围内?

问题描述

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

如果调用了函数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'

标签: python

解决方案


  • 无需转换为intor ord,直接比较字符串。
  • 您在循环内实例化count了 with 0,所以即使代码有效,您也总是会得到0or 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))

推荐阅读