簡體   English   中英

獲取字典的隨機樣本

[英]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 是如何構建的,然后我無法預見任何未來的問題

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))

鑒於您的示例:

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()))

用來自 numphy 的一些隨機樣本替換range(10)

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

這應該比創建一個新的 dict 並檢查鍵是否是樣本的一部分更快:

import random    
sample_n = 1000
output_dict = dict(random.sample(input_dict.items(), sample_n))
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}

類似於@J-Mourad 的好回答,但使用字典理解:

def sample_from_dict(d, n=10):
    keys = random.sample(list(d), n)
    return {k: d[k] for k in keys}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM