在塔webapp,我需要一串,如"<3, 45, 46, 48-51, 77" 并创建一个列表的整数(实际Id的目的)搜索。

任何建议的方式做到这一点?我是新来的蟒蛇,我还没有找到任何东西了那里有助于这样的事情。

该清单将是:[1, 2, 3, 45, 46, 48, 49, 50, 51, 77]

有帮助吗?

解决方案

其他提示

我已经创建了一个版本的@ vartec的溶液,其感觉更具有可读性:

def _parse_range(numbers: str):
    for x in numbers.split(','):
        x = x.strip()
        if x.isdigit():
            yield int(x)
        elif x[0] == '<':
            yield from range(0, int(x[1:]))
        elif '-' in x:
            xr = x.split('-')
            yield from range(int(xr[0].strip()), int(xr[1].strip())+1)
        else:
            raise ValueError(f"Unknown range specified: {x}")

在该过程中,函数成为发生器:)

rng = "<3, 45, 46, 48-51, 77"
ids = []
for x in map(str.strip,rng.split(',')):
    if x.isdigit():
        ids.append(int(x))
        continue
    if x[0] == '<':
        ids.extend(range(1,int(x[1:])+1))
        continue
    if '-' in x:
        xr = map(str.strip,x.split('-'))
        ids.extend(range(int(xr[0]),int(xr[1])+1))
        continue
    else:
        raise Exception, 'unknown range type: "%s"'%x

第一,你只需要找出什么样的语法你会接受。你目前有三个在你的例子:

  1. 单一编号:45、46的

  2. 少于操作者

  3. 冲范围:48-51分

在这之后,它只是问题的分裂串入标记和检查的格式的标记。

>>> print range.__doc__
range([start,] stop[, step]) -> list of integers

返回包含整数的算术级数的列表。 范围(I,J)返回[I,I + 1,I + 2,...,J-1];开始(!),默认为0。 当给定步骤中,指定递增(或递减)。 例如,范围(4)返回[0,1,2,3]。省略了终点! 这些正是为4个元素的列表的有效索引。

>>> range(33,44)
[33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43]
>>> range(1,3)
[1, 2]

我想你可以遍历列表,和呼叫范围内适当。

>>> def lessThan(n) :
...  return range(n+1)
...
>>> lessThan(4)
[0, 1, 2, 3, 4]
>>> def toFrom(n,m):
...  return range(n,m)
...
>>> toFrom(33,44)
[33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43]

然后分裂的逗号的字符串,并为每一位,解析它足以找出调用什么功能,catenating列表返回。

再说了,我会写它给你。

我也不得不做一个应用程序最近类似的东西。

如果你并不需要具体的数字,但只是一条路,一个给定的数字是否在范围内,你可能会考虑它解析为Python表达式,你可以EVAL为lambda。例如<3, 5-10, 12可以func=(lambda x:x<3 or (5 <= x <= 10) or x==12))。然后,你可以调用拉姆达,func(11),看是否属于11在那里。

scroll top