在python中从字典中删除一些固定数量的键的快速方法?

在python中从字典中删除一些固定数量的键的快速方法?,python,Python,是否有一种“快速”方法可以从字典中清除“k”键。这些可以是任何钥匙。 比如说,如果我必须查字典。。我可以简单地执行d.clear()whered={}。 但我想知道是否有一种“快速”(恒定顺序)的方法可以从字典中随机删除“k”键,而不是删除整个字典 你会这样回答吗 from random import sample d = {'foo': 1, 'bar': 2, 'doo': 3, 'tak': 4} def rand_clear(data, k): return dict(sam

是否有一种“快速”方法可以从字典中清除“k”键。这些可以是任何钥匙。 比如说,如果我必须查字典。。我可以简单地执行
d.clear()
where
d={}

但我想知道是否有一种“快速”(恒定顺序)的方法可以从字典中随机删除“k”键,而不是删除整个字典

你会这样回答吗

from random import sample

d = {'foo': 1, 'bar': 2, 'doo': 3, 'tak': 4}

def rand_clear(data, k):
    return dict(sample(data.items(), k=len(d)-k))

print(rand_clear(d, k=1))
结果

{'foo': 1, 'doo': 3, 'tak': 4}
注意:这不会删除任何项目,它只是用随机选择的项目创建一个新的dict

如果您确实想删除随机项,可以通过上述代码轻松完成:

def rand_clear(data, k):
    for key in sample(list(data), k=k):
        del data[key]

这将比第一种方法快

,总之。。。不。(事实上,
dict.clear()
也不是常数顺序,而是线性的,C代码中有。)也许保持10%会快一点?@YongkangZhao请详细说明。这样行吗?你是说去掉一个第k个元素?类似于列表中的索引?嗯,我想我看到你提到删除90%的键,可能只是随机选择10%的键,用这些键和值创建一个新的dict,并用原始dict替换。你实际上可以做
dict(sample(data.items(),k=k))
来避免
列表调用。@GZ0耶。。我也在想同样的。。似乎转换到列表是可以避免的。太完美了,我甚至没想到!请注意,这将保留
k
值,而不是清除
k
值。(虽然切换起来很简单。)它也是非破坏性的:它不会删除任何元素,但会在没有它们的情况下构建另一个dict。它不是恒定的时间;正如我之前所说,这是不可能做到的。也就是说,这很可能是足够的,任何更多的都几乎肯定是过早的优化。@Amandan I将k从k更改为len(d)-k,因此它基本上正确地删除了k项,而不是返回k项。关于构建另一个dict,您也是对的,尽管这似乎是大多数情况下的最佳解决方案。尽管可以很容易地让它替换方法中的数据或将d设置为函数的结果。这仅仅是为了举例。