Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于断点创建更大范围的子范围_Python_Algorithm - Fatal编程技术网

Python 基于断点创建更大范围的子范围

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: [

情景:

邮政编码范围从83000到83999

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

832218322283400

我需要检查一下这一系列的邮政编码,如果遇到特殊的邮政编码,则检查之前所有邮政编码的范围

需要考虑的事项:

  • 通过的范围可能没有特殊的邮政编码
  • 一系列邮政编码可能有两个或多个连续的特殊邮政编码
一个小规模的例子:

范围: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]
我认为递归可能在这里起作用


在上面的示例中,我特别关注的一个区域是
范围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我不确定是否需要将特殊邮政编码分组。我把它看作是一个警告:它可能会发生。。。但请看我的编辑。