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'
解决方案
- 无需转换为
int
orord
,直接比较字符串。 - 您在循环内实例化
count
了 with0
,所以即使代码有效,您也总是会得到0
or1
。
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))
推荐阅读
- logging - 使用 log4rs 将每个主机变量附加到 Rust 中的所有日志消息
- javascript - 如何在 Javascript 中循环访问来自 API 的数据?
- java - 有没有办法使用 JsonPath 动态地部分复制 Json?
- go - 从结构中删除字段,转换结构
- python - 如何每周在 Altair 中用刻度标记日期轴?
- android - 通过防火墙启用 IP 地址后 WebApi 错误
- powershell - 对于每个文件,我想创建一个目录,里面有几个文件夹
- java - 相同的应用,不同的行为
- c# - Onvif 相机获取当前位置
- python - 如何获取 SQL 查询的元数据?