如果你只想从列表中删除前 n
个元素,可以通过生成器轻松实现:
def remove_n_dupes(remove_from, what, how_many):
count = 0
for item in remove_from:
if item == what and count < how_many:
count += 1
else:
yield item
使用方法如下:
lst = [1,2,3,4,4,4,4,4]
print list(remove_n_dupes(lst, 4, 3))
如果我们使用一些额外的辅助存储,保留任何项目的指定数量的副本同样很容易:
from collections import Counter
def keep_n_dupes(remove_from, how_many):
counts = Counter()
for item in remove_from:
counts[item] += 1
if counts[item] <= how_many:
yield item
使用方法类似:
lst = [1,1,1,1,2,3,4,4,4,4,4]
print list(keep_n_dupes(lst, 2))
这里的输入是列表和您想要保留的最大项目数。但需要注意的是,这些项目必须是可哈希的...
n
个重复项吗?或者断言任何给定项最多只有m
个重复项? - mgilsonpop
出找到元素的索引。通过反向迭代,您确保弹出元素不会干扰下一次迭代,因此:for i, el in enumerate(reversed(seq)):if el == what:seq.pop(i)
,并且在弹出足够数量的元素后停止。 - Bakuriun
个重复项。我可能有[4,4,4,6,6,6,6,6]
并希望删除一个 4,但让 6 的数量不变。删除哪个重复项并不重要,也不需要保留顺序。 - Jacob Bond