根据断点创建更大范围的子范围

时间:2018-04-03 21:04:00

标签: python algorithm

情景:

一系列邮政编码83000至83999

有些邮政编码需要注意,需要单独处理:

83221,83222,83400

我需要查看这一系列的邮政编码,如果遇到特殊的邮政编码,请填写之前所有邮政编码的范围。

要考虑的事情:

  • 传递的范围可能没有特殊的邮政编码
  • 一系列邮政编码可能包含两个或多个连续的特殊邮政编码

规模较小的例子:

范围:1到10

特殊号码:5,8

最终结果:

Range 1: [1,2,3,4]

Range 2: [5,5]

Range 3: [6,7]

Range 4: [8,8]

Range 5: [9,10]

我认为递归可能会在这里发挥作用。

我坚持的一个领域是在上面的例子中Range 2之后。基本上,没有办法知道Range 3应该在不知道8是特殊数字的情况下停在7

1 个答案:

答案 0 :(得分:1)

这里不需要递归。您只需要建立一个当前列表,直到找到一个特殊号码。然后产生当前列表和带有特殊数字的单例。如果它不是空的,不要忘记在最后产生当前列表。

xs = list(range(1, 11))
s = set([5,8])

def gen(xs, s):
    cur = []
    for x in xs:
        if x in s:
            if cur:
                yield cur
            yield [x]
            cur = []
        else:
            cur.append(x)
    if cur:
        yield cur

print (list(gen(xs, s)))
# output: [[1, 2, 3, 4], [5], [6, 7], [8], [9, 10]]

您也可以使用一对索引并生成切片。

编辑要将特殊代码组合在一起,您只需要对循环进行一些调整:

def func(xs, s):
    cur = []
    for x in xs:
        if x in s: # a special code
            if cur and cur[-1] not in s: # cur is not special
                yield cur # yield it
                cur = [] # and restart
        else: # a non special code
            if cur and cur[-1] in s: # cur is special
                yield cur # yield it
                cur = [] # and restart
        cur.append(x) # always add the current code to cur
    if cur:
        yield cur