从数组中提取非唯一值

时间:2018-10-31 08:32:42

标签: ruby

我可以从数组中删除唯一值:

array_with_doubles = [[1, 2], [2, 3], [1, 2]]

使用uniq

array_with_doubles.uniq
# => [[1, 2], [2, 3]]

我想找到删除了哪些值。

6 个答案:

答案 0 :(得分:0)

给出上面的数组

array_with_doubles = [[1,2], [2,3], [1,2]]

只需运行以下命令,即可使数组值出现多次

array_with_doubles.group_by{|x|x}.map_values(&:size).select {|k,v| v>1}.keys
# => [[1,2]]

答案 1 :(得分:0)

可以通过以下方式确定唯一元素:

arr = [1, 2, 3, 2, 1, 4, 1]

uniq = arr.each_with_object(Hash.new(0)) {|e,h| h[e] += 1}.select {|_,v| v == 1}.keys
  #=> [3, 4]

要删除唯一元素:

arr.reject { |e| uniq.include?(e) }
  #=> [1, 2, 2, 1, 1]

数组中对象的性质(数字,数组,哈希,实例等)与问题无关。

确定唯一元素的方式是使用Hash::new的形式,该形式采用一个参数(此处为零),如果散列h[k]没有键{,则为h返回的值。 {1}}。因此,表达式k被Ruby扩展为

h[e] += 1

在评估之前,成为

h[e] = h[e] + 1

如果h[e] = 0 + 1 没有密钥h。有时称为计数哈希

答案 2 :(得分:0)

您可以尝试以下方法:

 array_with_doubles.uniq.select { |x| array_with_doubles.count(x) > 1 }

答案 3 :(得分:0)

您可以像这样获取所有已删除的元素:

array_with_doubles = [[1, 2], [2, 3], [1, 2], [1, 2]]
require 'set'
array_with_doubles.each_with_object(Set.new).inject([]) { |a, (e, seen)|
  a << e if seen === e
  seen << e
  a
}
# => [[1, 2], [1, 2]]

与大多数其他答案不同,如果某个元素将被uniq删除两次,则此代码将显示该元素的两个副本。 uniq保留第一个equal元素,而此代码拒绝第一个equal元素。

答案 4 :(得分:0)

我已经解决了以下问题,

arr.inject([[],[]]) { |m, a| m[0].include?(a) ? m[1] << a : m[0] << a; m }[1]

答案 5 :(得分:0)

另一种选择,一种衬垫:

array_with_doubles = [[1, 2], [2, 3], [1, 2], [1, 2], [3, 5], [3, 5]]

array_with_doubles.uniq.each_with_object(array_with_doubles) { |e, a| a.delete_at(a.rindex(e)) }
# => [[1, 2], [1, 2], [3, 5]]