情景:
一系列邮政编码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
答案 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