获取 dict 的随机样本

use*_*577 5 python random dictionary python-3.4

我正在使用一本大字典,出于某种原因,我还需要处理该字典中的小随机样本。我怎样才能得到这个小样本(例如长度为 2)?

这是一个玩具模型:

dy={'a':1, 'b':2, 'c':3, 'd':4, 'e':5}
Run Code Online (Sandbox Code Playgroud)

我需要在 dy 上执行一些涉及所有条目的任务。让我们说,为了简化,我需要将所有值相加:

s=0
for key in dy.key:
    s=s+dy[key]
Run Code Online (Sandbox Code Playgroud)

现在,我还需要对 dy 的随机样本执行相同的任务;为此,我需要一个 dy 密钥的随机样本。我能想象的简单解决方案是

sam=list(dy.keys())[:1]
Run Code Online (Sandbox Code Playgroud)

这样我就有了一个字典的两个键的列表,它们在某种程度上是随机的。因此,回到可能的任务,我需要在代码中进行的唯一更改是:

s=0
for key in sam:
    s=s+dy[key]
Run Code Online (Sandbox Code Playgroud)

关键是我不完全理解 dy.keys 是如何构建的,然后我无法预见任何未来的问题

小智 5

def sample_from_dict(d, sample=10):
    keys = random.sample(list(d), sample)
    values = [d[k] for k in keys]
    return dict(zip(keys, values))
Run Code Online (Sandbox Code Playgroud)

  • 感谢您提供此代码片段,它可能会提供一些有限的即时帮助。[正确的解释](https://meta.stackexchange.com/q/114762/349538)将通过展示为什么这是一个很好的问题解决方案来极大地提高其长期价值,并将使其对未来的读者更有用与其他类似的问题。请[编辑]您的答案以添加一些解释,包括您所做的假设。 (3认同)

Jon*_*nts 3

鉴于您的示例:

dy = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}
Run Code Online (Sandbox Code Playgroud)

那么所有值的总和更简单地表示为:

s = sum(dy.values())
Run Code Online (Sandbox Code Playgroud)

然后,如果内存不受限,您可以使用以下命令进行采样:

import random

values = list(dy.values())
s = sum(random.sample(values, 2))
Run Code Online (Sandbox Code Playgroud)

或者,既然random.sample可以采用set类似的对象,那么:

from operator import itemgetter
import random

s = sum(itemgetter(*random.sample(dy.keys(), 2))(dy))
Run Code Online (Sandbox Code Playgroud)

或者只是使用:

s = sum(dy[k] for k in random.sample(dy.keys(), 2))
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用 a heapq,例如:

import heapq
import random

s = sum(heapq.nlargest(2, dy.values(), key=lambda L: random.random()))
Run Code Online (Sandbox Code Playgroud)