首先,这里有一些其他选项适用于通用迭代(列表,字符串,迭代器等):
码
选项1 - 没有库 :
def remove(iterable, subsequence):
"""Yield non-subsequence items; sans libraries."""
seq = tuple(iterable)
subsequence = tuple(subsequence)
n = len(subsequence)
skip = 0
for i, x in enumerate(seq):
slice_ = seq[i:i+n]
if not skip and (slice_ == subsequence):
skip = n
if skip:
skip -= 1
continue
yield x
import more_itertools as mit
def remove(iterable, subsequence):
"""Yield non-subsequence items."""
iterable = tuple(iterable)
subsequence = tuple(subsequence)
n = len(subsequence)
indices = set(mit.locate(mit.windowed(iterable, n), pred=lambda x: x == subsequence))
it_ = enumerate(iterable)
for i, x in it_:
if i in indices:
mit.consume(it_, n-1)
else:
yield x
演示
list(remove(big_list, sub_list))
# [2, 3, 4]
list(remove([1, 2, 1, 2], sub_list))
# []
list(remove([1, "a", int, 3, float, "a", int, 5], ["a", int]))
# [1, 3, float, 5]
list(remove("11111", "111"))
# ['1', '1']
list(remove(iter("11111"), iter("111")))
# ['1', '1']
演示
pred = lambda *args: args == tuple(sub_list)
list(mit.replace(big_list, pred=pred, substitutes=[], window_size=2))
# [2, 3, 4]
pred=lambda *args: args == tuple(sub_list)
list(mit.replace([1, 2, 1, 2], pred=pred, substitutes=[], window_size=2))
# []
pred=lambda *args: args == tuple(["a", int])
list(mit.replace([1, "a", int, 3, float, "a", int, 5], pred=pred, substitutes=[], window_size=2))
# [1, 3, float, 5]
pred=lambda *args: args == tuple("111")
list(mit.replace("11111", pred=pred, substitutes=[], window_size=3))
# ['1', '1']
pred=lambda *args: args == tuple(iter("111"))
list(mit.replace(iter("11111"), pred=pred, substitutes=[], window_size=3))
# ['1', '1']
细节
在所有这些示例中,我们使用较小的窗口切片扫描主序列。 我们产生切片中未找到的任何内容并跳过切片中的任何内容。
选项1 - 没有库
迭代枚举序列并评估大小为n切片(子序列的长度)。 如果即将到来的切片等于子序列,则重置skip并产生该项。 否则,迭代它。 skip跟踪多少次推进循环,例如sublist的大小为n=2 ,因此每次匹配跳过两次。
注意,你可以通过删除前两个元组赋值并用seq替换iterable参数来转换此选项以单独使用序列 ,例如def remove(seq, subsequence):
在迭代中为每个匹配的子序列定位索引。 在迭代枚举迭代器时,如果在索引中找到indices ,则通过使用迭代器中的下一个n-1元素来跳过剩余的子序列。 否则,产生一个项目。
通过> pip install more_itertools安装此库。
此工具用替换值替换谓词中定义的项的子序列。 要删除项目,我们替换空容器,例如substitutes=[] 。 替换项的长度由window_size参数指定(该值等于子序列的长度)。