我想创建一个函数来计算字符串中多个范围内的字符数。假设有效字符为:
'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'
答案 0 :(得分:7)
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
由于布尔值子类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))