获取字典的随机样本
Get a random sample of a dict
我正在使用一本大词典,出于某种原因,我还需要处理该词典中的小随机样本。我怎样才能得到这个小样本(例如长度为 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是如何构造的,所以我无法预见任何未来的问题
鉴于你的例子:
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()))
用 numpy
中的一些随机样本替换 range(10)
{v:rows[v] for v in [list(rows.keys())[k] for k in range(10)]}
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}
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))
这应该比创建新字典并检查键是否是示例的一部分更快:
import random
sample_n = 1000
output_dict = dict(random.sample(input_dict.items(), sample_n))
我正在使用一本大词典,出于某种原因,我还需要处理该词典中的小随机样本。我怎样才能得到这个小样本(例如长度为 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是如何构造的,所以我无法预见任何未来的问题
鉴于你的例子:
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()))
用 numpy
中的一些随机样本替换range(10)
{v:rows[v] for v in [list(rows.keys())[k] for k in range(10)]}
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}
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))
这应该比创建新字典并检查键是否是示例的一部分更快:
import random
sample_n = 1000
output_dict = dict(random.sample(input_dict.items(), sample_n))