Naming question

Hi list

I actually just need the following method there is no doubt about it;)
but the name which sprang into mind naturally "partition_by"
has a serious shortcoming, it is not POLS in the sense that
Enumerable#partition returns an array and Enumerable#partition_by
returns a hash.

module Enumerable
  def partition_by &blk
    result = Hash.new {|h,k| h[k] = [] }
    each do | element |
      result[ element ] << blk.call element
    end
    result
  end
end

Any ideas for a nice different name?
Does Facet implement the above maybe?

A remark for my fellow fans of inject, the same code with inject
somehow does not feel right, I do not like to use inject with this
pattern
inject(...){ |acc,ele|
     ...
     acc
}

Thanx in advance
Robert

···

--
http://ruby-smalltalk.blogspot.com/

---
Whereof one cannot speak, thereof one must be silent.
Ludwig Wittgenstein

Enumerable#cluster_by
great that would have been a nice name thanx Tom :wink:
but I can live with your group_by :slight_smile:
issue resolved

Actually I never thaught that Facets doc was so darn pretty good that
I could find it myself, should never have asked....

R.

···

On Fri, Apr 18, 2008 at 9:36 AM, Robert Dober <robert.dober@gmail.com> wrote:

Does Facet implement the above maybe?

--
http://ruby-smalltalk.blogspot.com/

---
Whereof one cannot speak, thereof one must be silent.
Ludwig Wittgenstein

# module Enumerable
# def partition_by &blk
# result = Hash.new {|h,k| h[k] = [] }
# each do | element |
# result[ element ] << blk.call element
# end
# result
# end
# end

i think this is #group_by in 1.8.7 and 1.9 ?

kind regards -botp

···

From: Robert Dober [mailto:robert.dober@gmail.com]

Which, I believe, first showed up in Rails sometime in 2006.

···

On Fri, Apr 18, 2008 at 4:02 AM, Peña, Botp <botp@delmonte-phil.com> wrote:

From: Robert Dober [mailto:robert.dober@gmail.com]
# module Enumerable

# def partition_by &blk
# result = Hash.new {|h,k| h[k] = }
# each do | element |
# result[ element ] << blk.call element
# end
# result
# end
# end

i think this is #group_by in 1.8.7 and 1.9 ?

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/

Florian Gross published a version in Jan 2005:
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/4311

There are possibly even earlier ones.

Credit where credit is due :slight_smile:

Regards,
Sean

···

On Fri, Apr 18, 2008 at 12:10 PM, Rick DeNatale <rick.denatale@gmail.com> wrote:

Which, I believe, first showed up in Rails sometime in 2006.

--
Rick DeNatale

module Enumerable
   def group_by
     result = Hash.new { |h, k| h[k] = Array.new }
     self.each do |item|
       group = yield(item)
       result[group] << item
     end
     return result
   end
end

This is the code of the post linked to above, as one can see it works,
not as mine above :slight_smile:
but this natural way to write it is quite inefficient as the Facets
version shows. I have benchmarked them and to my surprise and that of
many others I guess the Facets implementation is almost twice as fast
- for many different keys at least

result = {}
each do | ele|
   ( result[ yield(ele) ] ||= ) << ele
end
result.

Does anybody have the faintest idea why Hash.new{|h,k| ... } is so inefficient?

BTW I am quite happy that #group_by is quasi a standard name for this.

Cheers
Robert

···

On Fri, Apr 18, 2008 at 6:04 PM, Sean O'Halpin <sean.ohalpin@gmail.com> wrote:

On Fri, Apr 18, 2008 at 12:10 PM, Rick DeNatale <rick.denatale@gmail.com> wrote:
>
> Which, I believe, first showed up in Rails sometime in 2006.
>
> --
> Rick DeNatale
>

Florian Gross published a version in Jan 2005:
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/4311

--
http://ruby-smalltalk.blogspot.com/

---
Whereof one cannot speak, thereof one must be silent.
Ludwig Wittgenstein