python列表溢出_python - 如何从列表中删除每个出现的子列表 - 堆栈内存溢出

首先,这里有一些其他选项适用于通用迭代(列表,字符串,迭代器等):

选项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参数指定(该值等于子序列的长度)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值