Учитывая хэш с массивом значений, как извлечь числа уникальных значений каждого ключа? - PullRequest
0 голосов
/ 23 июня 2019

У меня есть хеш, в котором есть массив значений для каждого ключа:

h = {
  'a' => ['c', 'b', 'd'],
  'b' => ['c', 'b', 'f', 'g']
}

Мне нужно вернуть хеш g, который дает количество «уникальных» значений каждого ключа в h. Например, h['a'] имеет 2 значения ('c' и b'), которые не являются уникальными в том смысле, что они присутствуют в h['b']. В этом случае значение 'a' в g должно равняться 1, поскольку 'd' является единственным уникальным элементом h['a']. То же самое касается ключа 'b'. Он имеет 2 общих значения с 'a' в h, но также 2 уникальных ('f' и g'). Так что в моем случае g должно равняться {'a' => 1, b => 2}.

Я пробовал h.select { |_,a| a.size == 1 }, но он возвращает пустой хеш.

Кроме того, у меня есть способ вернуть уникальные значения, но когда я пытаюсь написать тест Rspec, он не проходит, у меня есть следующее решение:

@split_log_file.each { |key, array|
  "#{key} has #{array.uniq.length} unique visitors" }

Ответы [ 2 ]

2 голосов
/ 23 июня 2019

Это должно соответствовать вашим требованиям.

def uniqify(h)
  keys = h.keys
  keys.each_with_object({}) { |k,g| g[k] =
    (keys-[k]).reduce(h[k]) { |a,kk| a-h[kk] }.uniq.size } }
end

h = { 'cat' => ['c', 'b', 'e', 'f', 'c'],
      'dog' => ['c', 'b', 'f', 'g', 'h'] }

uniqify h
  #=> {"cat"=>1, "dog"=>2}

h = { 'cat' => ['c', 'b', 'd', 'c', 'e', 'f'],
      'dog' => ['c', 'b', 'f', 'g'],
      'pig' => ['h', 'h', 'b', 'f'] }

uniqify h
  #=> {"cat"=>2, "dog"=>1, "pig"=>1}

См. Массив # -. 1016 *

1 голос
/ 24 июня 2019

Ниже код будет работать с более чем двумя ключами

h = {
  'a' => ['c', 'b', 'd'],
  'b' => ['c', 'b', 'f', 'g']
}
g={}

all_values = h.values.flatten
uniq_elements = all_values.select{|element| all_values.count(element) == 1 }
h.each do |k,v|
  g[k] = (v & uniq_elements).count
end
g

Если мы не хотим проверять дубликаты в массиве хэшей self, тогда мы можем собирать uniq, как показано ниже

h = { 'cat' => ['c', 'b', 'd', 'c', 'e', 'f'],
      'dog' => ['c', 'b', 'f', 'g'],
      'pig' => ['h', 'h', 'b', 'f'] }

g={}

all_values = h.values.collect{|val| val.uniq}.flatten
uniq_elements = all_values.select{|element| all_values.count(element) == 1 }
h.each do |k,v|
  g[k] = (v & uniq_elements).count
end
g
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...