获取字典的随机样本[重复]

问题描述 投票:0回答:6

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

这是一个玩具模型:

dy={'a':1, 'b':2, 'c':3, 'd':4, 'e':5}

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

s=0
for key in dy.key:
    s=s+dy[key]

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

sam=list(dy.keys())[:1]

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

s=0
for key in sam:
    s=s+dy[key]

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

python dictionary random python-3.4
6个回答
8
投票
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))

3
投票

举个例子:

dy = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}

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

s = sum(dy.values())

然后,如果不是内存限制,您可以使用以下方式进行采样:

import random

values = list(dy.values())
s = sum(random.sample(values, 2))

或者,由于

random.sample
可以接受类似
set
的物体,那么:

from operator import itemgetter
import random

s = sum(itemgetter(*random.sample(dy.keys(), 2))(dy))

或者只是使用:

s = sum(dy[k] for k in random.sample(dy.keys(), 2))

另一种方法是使用

heapq
,例如:

import heapq
import random

s = sum(heapq.nlargest(2, dy.values(), key=lambda L: random.random()))

1
投票

用 numphy 中的一些随机样本替换

range(10)

{v:rows[v] for v in [list(rows.keys())[k] for k in range(10)]}


0
投票

这应该比创建新字典并检查键是否是示例的一部分更快:

import random    
sample_n = 1000
output_dict = dict(random.sample(input_dict.items(), sample_n))

-1
投票
import random
origin_dict =  {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}
sample_rate = 0.3
random_keys = random.sample(list(origin_dict.keys()), int(sample_rate * len(origin_dict)))
random_values = [origin_dict[k] for k in random_keys]

sample_dict = dict(zip(random_keys, random_values))

输出:

{'d': 4, 'c': 3}

-1
投票

类似于 @J-Mourad 的好答案,但使用字典理解:

def sample_from_dict(d, n=10):
    keys = random.sample(list(d), n)
    return {k: d[k] for k in keys}
© www.soinside.com 2019 - 2024. All rights reserved.