Python 定期从列表中删除项目
Python periodically remove items from a list
假设我有一个包含 1000 个元素的长列表,我想根据两个变量定期删除元素组。
所以对于 my_list=[1,2,3,4...1000]
和 a=5
、b=7
,我会保留前 5 个元素,删除接下来的 7 个,并重复直到列表末尾。
列表将如下所示:
my_list = [1,2,3,4,5,12,13,14,15,16...]
在使用它们之前我不知道 a 或 b,也不知道列表的长度,所以我正在寻找一个通用的解决方案。
谢谢!
这是使用 enumerate
并在 a
和 b
的总和上获取索引的 mod
的一种方法。过滤掉 mod 小于 a
:
的值
l = range(1, 30)
a, b = 5, 7
r = [x for i, x in enumerate(l) if i%(a+b) < a]
print(r)
# [1, 2, 3, 4, 5, 13, 14, 15, 16, 17, 25, 26, 27, 28, 29]
P.S。如果您要删除接下来的 7 个,则不应包括 12 个。
这是使用迭代器的另一种方法:
import itertools as it
L = list(range(1000))
a, b = 5, 7
mask = it.chain(it.repeat(1, a), it.repeat(0, b))
Result = list(it.compress(L, it.cycle(mask)))
Documentation of the itertools
standard module。
这里很酷的是没有中间数据存储在内存中,所有结果都是即时生成的。
假设我有一个包含 1000 个元素的长列表,我想根据两个变量定期删除元素组。
所以对于 my_list=[1,2,3,4...1000]
和 a=5
、b=7
,我会保留前 5 个元素,删除接下来的 7 个,并重复直到列表末尾。
列表将如下所示:
my_list = [1,2,3,4,5,12,13,14,15,16...]
在使用它们之前我不知道 a 或 b,也不知道列表的长度,所以我正在寻找一个通用的解决方案。
谢谢!
这是使用 enumerate
并在 a
和 b
的总和上获取索引的 mod
的一种方法。过滤掉 mod 小于 a
:
l = range(1, 30)
a, b = 5, 7
r = [x for i, x in enumerate(l) if i%(a+b) < a]
print(r)
# [1, 2, 3, 4, 5, 13, 14, 15, 16, 17, 25, 26, 27, 28, 29]
P.S。如果您要删除接下来的 7 个,则不应包括 12 个。
这是使用迭代器的另一种方法:
import itertools as it
L = list(range(1000))
a, b = 5, 7
mask = it.chain(it.repeat(1, a), it.repeat(0, b))
Result = list(it.compress(L, it.cycle(mask)))
Documentation of the itertools
standard module。
这里很酷的是没有中间数据存储在内存中,所有结果都是即时生成的。