【发布时间】:2020-10-07 03:55:50
【问题描述】:
我正在尝试创建一个函数,该函数在列表中找到一个 1 后跟一个 2 并将其切断,包括它之间的所有内容。无论列表中有多少 1-2 部分,它都应该适用。
例如:
sumOf12([1, 2, 2, 1, 99, 99, 2])
应该有 [2] 的输出,因为前 1-2 被切断了。
numList[3] 和 numList[6] 也是 1-2 对,所以中间的所有东西也都被切断了。
【问题讨论】:
我正在尝试创建一个函数,该函数在列表中找到一个 1 后跟一个 2 并将其切断,包括它之间的所有内容。无论列表中有多少 1-2 部分,它都应该适用。
例如:
sumOf12([1, 2, 2, 1, 99, 99, 2])
应该有 [2] 的输出,因为前 1-2 被切断了。
numList[3] 和 numList[6] 也是 1-2 对,所以中间的所有东西也都被切断了。
【问题讨论】:
创建一个空列表或参数“结果” 做一个while循环。可选:在退出条件下,eiter 索引 1 或 2 提供返回 -1(未找到)。
进入while循环并搜索索引1。如果没有找到,中止并将列表添加到结果中。如果找到,则从索引 1 开始搜索索引 2。此处相同,如果未找到索引 2,则将所有内容添加到结果列表中。 如果两者都找到,则删除索引 1 之前的所有内容并将其添加到结果中。然后删除从索引 1 到索引 2 的所有内容。 继续 while 循环。
如果您附加到结果列表,可能会有不同的选项。如果您只想将值彼此相加,则可以使用加法。如果您想在之前检查您的结果,创建一个列表似乎更好。
可能是您想要这样的结果 [[2,3,4,1,4],[1],[2,2]] 或这样的平面列表 [2,3,4,1, 4,1,2,2]。两者都是可能的,但这取决于编程语言如何解决这个问题。
使用有效的测试数据来检查您的结果。然后,您将查看它是否适用于每种情况。
【讨论】:
一种简单明了的方法:
def drop_between(xs, first, last):
include = True
for x in xs:
if include:
if x == first:
include = False
else:
yield x
else:
if x == last:
include = True
print(list(drop_between([1, 2, 2, 1, 99, 99, 2], 1, 2)))
结果:
[2]
除了使用yield 创建生成器(然后使用list() 在列表中捕获结果),您当然可以创建一个空列表并使用.append() 添加结果。
但是,如果遇到1 并且从未出现2,则所有以1 开头的值仍将被删除 - 也许这不是您想要的?
即:
print(list(drop_between([1, 2, 2, 1, 99, 99], 1, 2)))
结果:
[2]
一种跟踪跳过项目的解决方案,因此如果没有找到 last 标记,它仍然可以产生那些:
def drop_between(xs, first, last):
skipped = []
for x in xs:
if not skipped:
if x == first:
skipped = [x]
else:
yield x
else:
skipped.append(x)
if x == last:
skipped = []
if skipped:
yield from skipped
print(list(drop_between([1, 2, 2, 1, 99, 99], 1, 2)))
结果:
[2, 1, 99, 99]
【讨论】: