我有一个数组,其中包含n
个元素。每个元素包含两个词。
这使数组看起来像这样:['England John', 'England Ben', 'USA Paul', 'England John']
我想找到每个国家/地区的唯一名称的数量。例如,England
将有2个唯一的名称,因为John
存在两次。
到目前为止,我已将数组分为两个数组,一个包含['England', 'Usa', ...]
之类的国家,另一个包含名称['John', 'Paul', ...]
的国家,但是我不确定从何而来
答案 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::new的Set#add?形式。
我不清楚这两个计算中的哪一个通常会更快。