You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby如何查找相同属性的记录并进行聚类分组?

在Ruby中按指定属性聚类相同记录

这事儿在Ruby里真的超简单,核心就是用Enumerable模块自带的group_by方法——它天生就是用来把具有相同特征的元素归为一组的完美工具,完全符合你“属性完全相同才聚类,不一致就不聚”的需求。

我给你分场景一步步演示:

1. 先准备示例数据

假设我们有一组动物记录,用哈希或者自定义类都可以,先拿哈希举例子(直观好懂):

animals = [
  { name: "Lion", type: "Mammal", color: "Golden" },
  { name: "Tiger", type: "Mammal", color: "Orange" },
  { name: "Whale", type: "Mammal", color: "Gray" },
  { name: "Eagle", type: "Bird", color: "Brown" },
  { name: "Owl", type: "Bird", color: "Brown" },
  { name: "Penguin", type: "Bird", color: "Black" }
]

2. 按单个属性聚类

比如你想按type(动物类型)聚类,只要用group_by指定要分组的属性就行:

# 按type属性分组聚类
clustered_by_type = animals.group_by { |animal| animal[:type] }

# 打印看看结果
clustered_by_type.each do |type, group|
  puts "=== 类型:#{type} ==="
  group.each { |animal| puts "  - #{animal[:name]}(颜色:#{animal[:color]})" }
end

运行后你会看到所有哺乳动物归为一组,鸟类归为另一组,完全符合预期。

3. 按多个属性组合聚类

如果需要同时满足多个属性完全相同才聚类(比如type和color都一样),只要把这两个属性组成一个数组作为分组键就行——Ruby里数组可以直接当哈希键用:

# 同时按type和color聚类,只有两个属性都匹配才会分到同一组
clustered_by_type_color = animals.group_by { |animal| [animal[:type], animal[:color]] }

# 打印结果
clustered_by_type_color.each do |(type, color), group|
  puts "=== 类型:#{type},颜色:#{color} ==="
  group.each { |animal| puts "  - #{animal[:name]}" }
end

这时候你会发现,Eagle和Owl因为都是鸟类且颜色都是棕色,会被分到同一组;而其他动物因为属性不完全匹配,各自成组或者和同属性的在一起。

4. 用自定义类的情况

如果你的记录是自定义类的实例,用法也差不多,只是访问属性的方式变成了实例方法:

class Animal
  attr_reader :name, :type, :color

  def initialize(name, type, color)
    @name = name
    @type = type
    @color = color
  end
end

# 创建实例数组
animals = [
  Animal.new("Lion", "Mammal", "Golden"),
  Animal.new("Tiger", "Mammal", "Orange"),
  Animal.new("Whale", "Mammal", "Gray"),
  Animal.new("Eagle", "Bird", "Brown"),
  Animal.new("Owl", "Bird", "Brown"),
  Animal.new("Penguin", "Bird", "Black")
]

# 同样用group_by聚类
clustered = animals.group_by { |animal| [animal.type, animal.color] }

5. 额外:处理聚类后的结果

如果聚类后你只想保留每个组里的特定字段(比如动物名字),可以用transform_values配合map快速处理:

# 只保留每个组的动物名称
grouped_names = clustered.transform_values { |group| group.map(&:name) }
# 结果会是:{"Mammal"=>["Lion", "Tiger", "Whale"], "Bird"=>["Eagle", "Owl", "Penguin"]}

总的来说,group_by就是处理这类需求的最优解——它逻辑清晰,代码简洁,完全满足你“属性完全相同才聚类”的要求,而且不管是单个还是多个属性组合都能轻松应对。

内容的提问来源于stack exchange,提问作者user5639287

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:00:57