如何在Ruby中查找数组的唯一出现次数

时间:2019-06-04 14:49:40

标签: ruby

我有一个数组,其中包含n个元素。每个元素包含两个词。

这使数组看起来像这样:['England John', 'England Ben', 'USA Paul', 'England John']

我想找到每个国家/地区的唯一名称的数量。例如,England将有2个唯一的名称,因为John存在两次。

到目前为止,我已将数组分为两个数组,一个包含['England', 'Usa', ...]之类的国家,另一个包含名称['John', 'Paul', ...]的国家,但是我不确定从何而来

4 个答案:

答案 0 :(得分:4)

一个班轮选项:

var basePrice = 12.99;

$(".calculate").change(function() {
    newPrice = basePrice;  
    newPrice += $(this).children(':selected').data('price');
    $(this).nextAll('span').html(newPrice.toFixed(2));
});

答案 1 :(得分:3)

实际上,问题在于您将这些数据存储为字符串数组。这是对数据结构的错误选择,因为它会使操作更加困难。

例如,假设我们首先将数据转换为Hash,它将每个国家/地区映射到名称列表:

data = ['England John', 'England Ben', 'USA Paul', 'England John']

mapped_names = {}

data.each do |item|
  country, name = item.split
  mapped_names[country] ||= []
  mapped_names[country] << name
end

现在,获取计数非常简单:

mapped_name_counts = unique_names.transform_values { |names| names.uniq.count }

结果变量为:

mapped_names # => {"England"=>["John", "Ben", "John"], "USA"=>["Paul"]}
mapped_name_counts # => {"England"=>2, "USA"=>1}

如果使用ruby 2.7版(尚未发布!),那么最后一行代码甚至可以简化为:

mapped_name_counts = unique_names.tally(&:uniq)

答案 2 :(得分:0)

比其他解决方案更详细,但不使用ActiveSupport中的transform_values

require "set"

data = ["England John", "England Ben", "USA Paul", "England John", "Switzerland Pascal"]

names_per_country = data.each_with_object({}) do |country_and_name, accu|
  country, name = country_and_name.split(" ")
  country_data = accu[country] ||= Set.new
  country_data << name
end

names_per_country.each do |country, names|
  puts "#{country} has #{names.size} unique name(s)"
end

# => England has 2 unique names
# => USA has 1 unique names
# => Switzerland has 1 unique names

此解决方案首先将数组转换为Hash结构,其中 key 是国家/地区名称,而 value Set。 我之所以选择Set是因为它确实会自动解决您问题的唯一部分(Set不能包含重复项)。

此后,您可以通过检查size中的Set来找到每个国家的唯一名称数。 您还可以找到名称(Set的元素,如果需要的话)

答案 3 :(得分:0)

if df.columns.get_loc('Age') < df.columns.get_loc('Name'):
    df.insert(df.columns.get_loc('Age'), 'Name', df.pop('Name'))

arr = ['England John', 'England Ben', 'USA Paul', 'England John']

这需要两次遍历数组(arr.uniq.each_with_object(Hash.new(0)) { |s,h| h[s[/\S+/]] += 1 } #=> {"England"=>2, "USA"=>1} 是第一遍)。要仅进行一次通过,可以执行以下操作。

arr.uniq

请参见带有参数(称为默认值)和Hash::newSet#add?形式。

我不清楚这两个计算中的哪一个通常会更快。