Python 基于断点创建更大范围的子范围
情景: 邮政编码范围从83000到83999 有些邮政编码需要注意,需要单独处理: 832218322283400 我需要检查一下这一系列的邮政编码,如果遇到特殊的邮政编码,则检查之前所有邮政编码的范围 需要考虑的事项:Python 基于断点创建更大范围的子范围,python,algorithm,Python,Algorithm,情景: 邮政编码范围从83000到83999 有些邮政编码需要注意,需要单独处理: 832218322283400 我需要检查一下这一系列的邮政编码,如果遇到特殊的邮政编码,则检查之前所有邮政编码的范围 需要考虑的事项: 通过的范围可能没有特殊的邮政编码 一系列邮政编码可能有两个或多个连续的特殊邮政编码 一个小规模的例子: 范围:1至10 特别号码:5、8 最终结果: Range 1: [1,2,3,4] Range 2: [5,5] Range 3: [6,7] Range 4: [
- 通过的范围可能没有特殊的邮政编码
- 一系列邮政编码可能有两个或多个连续的特殊邮政编码
Range 1: [1,2,3,4]
Range 2: [5,5]
Range 3: [6,7]
Range 4: [8,8]
Range 5: [9,10]
我认为递归可能在这里起作用
在上面的示例中,我特别关注的一个区域是
范围2
之后。基本上,如果不知道8是一个特殊的数字,就无法知道范围3应该在7处停止。你只需要建立一个当前列表,直到你找到一个特殊的号码。然后生成当前列表和带有特殊编号的单例。如果当前列表不是空的,不要忘了在最后给出它
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
问题在哪里?您已经知道
8
是问题设置中给出的一个特殊数字。这是简单的区间逻辑。我想帮你,但我不知道你在哪里被卡住了——你似乎掌握了很好的逻辑。循环或递归可能也同样有效。我会选择一个循环。当您手工编写示例时,请编写以相同方式执行相同操作的python代码。然后检查是否所有案例都已处理。您的解决方案没有处理此要求:“一系列邮政编码可能有两个或更多连续的特殊邮政编码”。至少如果“可以”被理解为“应该,如果可能的话”。[[97020,97021],[97022,97022],[97023,97023],[97024,97025,97026,97027,97028,97029,97030],[97032,97032],[97033,97034,97035],
97022和97023都是特殊的Zipcode,所以看起来它是有效的。。neat@ArndtJonasson我不确定是否需要将特殊邮政编码分组。我把它看作是一个警告:它可能会发生。。。但请看我的编辑。