保留随机列表元素并删除其他元素
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']
我有一个很大的元素列表:
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']