Подтвердить что ты не робот

Есть ли эквивалент `Array:: sample` для хэшей?

Я хочу извлечь n случайных пар ключ-значение из хеша.

4b9b3361

Ответ 1

Hash[original_hash.to_a.sample(n)]

Для Ruby 2.1,

original_hash.to_a.sample(n).to_h

Ответ 2

Я не знаю такого метода. Тем не менее вы можете сделать что-то вроде:

h[h.keys.sample]

Если вам нужно пробовать более одного элемента, код должен быть немного сложнее.

EDIT: чтобы получить пары ключевых значений вместо того, чтобы вы могли сделать что-то вроде:

keys_sample = h.keys.sample(n)
keys_sample.zip(keys_sample.map{|k| h[k])

Ответ 3

Если ваш образец имеет только один элемент, вы можете использовать это:

sample = h.keys.sample
h.select { |k,v| k == sample }

Или, если ваш образец содержит более одного элемента, используйте это:

n = 2
sample = h.keys.sample(n)
h.select { |k,v| sample.include?(k) }

Ответ 4

Чтение ответов с наивысшим рейтингом, с которыми я согласен:

  • Если вы хотите отбирать только один элемент из хэша, @Ivaylo Strandjev решение использует только хэш-поиск и Array#sample:

    hsh[hsh.keys.sample]
    
  • Чтобы пробовать несколько хеш-элементов, @sawa answer использует Array#to_h:

    hsh.to_a.sample(n).to_h
    

Обратите внимание, что как упоминается @cadlac, hsh.to_a.sample.to_h не будет работать должным образом. Он поднимет

TypeError: wrong element type String at 0 (expected array)

потому что Array#sample в этом случае возвращает только массив элементов, а не массив, содержащий массив элементов.

Обходным решением является его решение, предоставляющее n = 1 в качестве аргумента:

hsh.to_a.sample(1).to_h

PS: не искать upvotes, добавляя его только как объяснение для людей, более новых для Ruby.

Ответ 5

Один из способов добиться этого:

rank_hash = {"Listen" => 1, "Download" => 60, "Share" => 150, "Purchase" => 700 }

rank_array = rank_hash.to_a

Затем вызовите это, чтобы получить образец случайного массива пары k/v:

rank_array[rand(0..3)]

или это, чтобы не жестко закодировать длину массива:

rank_array[rand(0..(rank_array.length) -1)]

Пример:

["Download", 60]