Ruby 从数组中提取非唯一值
我可以从数组中删除唯一值:Ruby 从数组中提取非唯一值,ruby,Ruby,我可以从数组中删除唯一值: array_with_doubles = [[1, 2], [2, 3], [1, 2]] 使用uniq: array_with_doubles.uniq # => [[1, 2], [2, 3]] 我想找出哪些值被删除。给定上述数组 array_with_doubles = [[1,2], [2,3], [1,2]] 只需运行以下命令,即可多次显示数组值 array_with_doubles.group_by{|x|x}.map_values(&
array_with_doubles = [[1, 2], [2, 3], [1, 2]]
使用uniq
:
array_with_doubles.uniq
# => [[1, 2], [2, 3]]
我想找出哪些值被删除。给定上述数组
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]]
可按以下方式确定唯一元素:
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]
数组中对象的性质(数字、数组、哈希、实例等)与问题无关
确定唯一元素时使用的形式为,它接受一个参数(此处为零),如果哈希h
没有键k
,则该参数是h[k]
返回的值。因此,表达式h[e]+=1
,Ruby扩展为
h[e] = h[e] + 1
在对其进行评估之前,它将成为
h[e] = 0 + 1
如果h
没有键k
。这有时被称为计数哈希。您可以尝试以下方法:
array_with_doubles.uniq.select { |x| array_with_doubles.count(x) > 1 }
您可以按如下方式获取所有已删除的元素:
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]]
array_与_double=[[1,2],[2,3],[1,2],[1,2]]
需要“设置”
数组_与_加倍。每个_与_对象(Set.new)。注入([]){| a,(e,seen)|
a我已经解决了上面的问题,如下所示
arr.inject([[],[]]) { |m, a| m[0].include?(a) ? m[1] << a : m[0] << a; m }[1]
arr.inject([[],[]){| m,a | m[0]。包括?(a)m[1]另一个选项,一个线性:
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]]
提示:.group\u by(&:本身)
您可以通过询问数组中的哪些元素是唯一的来简化措辞,除非您希望答案也显示如何从数组中删除唯一的元素(在这种情况下,您应该明确该要求)。标题和第一句似乎有冲突。我认为您希望识别唯一值并删除它们,尽管后一个操作似乎不是问题的一部分。与使用group\u by
或计数哈希(即O(n))相比,这具有时间复杂性O(n**2)
的缺点
。这是因为计数
是O(n)
,必须对数组中的每个元素进行计数。您可以通过在之前插入.uniq
来加快计数速度。选择。在我注意到复制了解决方案后更新。