我想定义一个get_level(module_info)
以整数形式返回模块的级别。级别是模块代码左侧的第一个数字字母。模块代码可以是'CS1010S'
。
def get_level(module_info):
return module_info[0][2]
然而,这只适用于module_info = ('CS1010S', 'A+')
,它会给我1。
如果您module_info =('SSA1207', 'B+')
看到它会给我A
而不是1
这是我想要的输出。
答案 0 :(得分:2)
您希望字符串的第一个字符属于某种类型(在本例中为数字)。 str.isdigit
测试一个字符,当且仅当该字符是数字时才返回True
。
这样,您可以使用itertools.dropwhile
删除字符串中不是数字的每个前导字符,然后选取第一个字符(因此将是一个数字),这是您想要的:
In [110]: import itertools
In [111]: next(itertools.dropwhile(lambda s: not s.isdigit(), 'SSA1207'))
Out[111]: '1'
In [112]: next(itertools.dropwhile(lambda s: not s.isdigit(), 'CS1010S'))
Out[112]: '1'
In [113]: next(itertools.dropwhile(lambda s: not s.isdigit(), 'CS2010S'))
Out[113]: '2'
答案 1 :(得分:2)
怎么样:
def get_level(module_info):
return next(c for c in module_info[0] if c.isdigit())
之后:
>>> get_level(('CS1010S', 'A+'))
'1'
>>> get_level(('SSA1207', 'B+'))
'1'
>>> get_level(('M9', 'C-'))
'9'
next
是一个方便的内置函数,它获取可迭代的事物的下一个元素,(c for c in module_info[0] if c.isdigit())
是一个生成器表达式,在迭代时生成module_info[0]
中的所有数字。例如:
>>> module_info = (('SSA1207', 'B+'))
>>> list(c for c in module_info[0] if c.isdigit())
['1', '2', '0', '7']
如果没有任何数字,next
会引发StopIteration
,但如果您真的想要,可以将其传递给默认值,例如。
next((c for c in module_info[0] if c.isdigit()), None)
答案 2 :(得分:1)
这不是性能最佳的方法,但它是可以理解的并且有效:
def get_level(module_info):
for i in module_info[0]:
if str.isdigit(i):
return i
<强>演示:强>
print get_level(('CS1010S', 'A+')) # 1
print get_level(('SSA1207', 'B+')) # 1