从输入中查找数字字母的函数

时间:2014-04-09 16:34:18

标签: python

我想定义一个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这是我想要的输出。

3 个答案:

答案 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