保留随机列表元素并删除其他元素

keep random list elements and remove the others

我有一个很大的元素列表:

list=[a1,b,c,b,c,d,a2,c,...a3.......]

我想从中删除特定元素 a1, a2, a3 假设我可以获得以 a

开头的元素的索引
a_indexes = [0,6, ...]

现在,我想删除大部分以 a 开头的元素,但不是全部,我想保留其中 20 个任意选择的元素。我该怎么做?

我知道要从列表 list_ 中删除一个元素可以使用:

list_.remove(list[element position])

但我不确定如何使用列表。

假设你有这个列表:

li=['d', 'a', 'c', 'a', 'g', 'b', 'f', 'a', 'c', 'g', 'e', 'f', 'e', 'g', 'b', 'b', 'c', 'e', 'a', 'd', 'g', 'd', 'd', 'a', 'c', 'e', 'a', 'c', 'f', 'a', 'b', 'a', 'a', 'f', 'b', 'd', 'd', 'b', 'f', 'a', 'd', 'g', 'd', 'b', 'e']

您可以定义要删除的字符和要删除的字符数 k

delete='a'
k=3

然后使用random.shuffle随机生成一组k个索引来删除:

idx=[i for i,c in enumerate(li) if c==delete]
random.shuffle(idx)
idx=idx[:k]
>>> idx
[3, 7, 31]

然后删除那些索引:

new_li=[e for i,e in enumerate(li) if i not in idx]

如果我正确理解了问题,这里有一种方法会奏效。

我们有一个包含许多项目的列表。我们想删除一些符合特定条件的元素 - 但不是全部。

所以:

from random import sample
li = ['a','b','a','b','a','b','a']
dc = 'a'
keep = 1 # this is how many we want to keep in the list

if (k := li.count(dc) - keep) > 0: # sanity check
    il = [i for i, v in enumerate(li) if v == dc]
    for i in sorted(sample(il, k), reverse=True):
        li.pop(i)

print(li)

注意样本是如何排序的。这很重要,因为我们正在弹出元素。如果我们没有按特定顺序执行此操作,那么我们最终可能会删除错误的元素。

输出示例可能是:

['b', 'b', 'a', 'b']