Hash.from_zipped_array

Hi folks,

Array has got a pretty cool method zip which ‘zips’ two arrays together
like so:

[1,2,3].zip([2,4,6])
=> [[1,2],[2,4],[3,6]]

That’s also what you get when you call to_a on a Hash like
{1=>2,2=>4,3=>6}, so I thought why not add a method to Hash to do the
reverse, that is to construct a Hash from a zipped array?

class Hash
def Hash.from_zipped_array(zipped_array)
zipped_array.inject({}) do |hash,key_value_pair|
hash[key_value_pair[0]] =key_value_pair[1]
hash
end
end
end

Example usage

animal = [“dog”,“cat”,bird"]
sound = ["woof,“meow”,“cheep”]

make_a_sound_like_a = Hash.from_zipped_array(animal.zip(sound)
make_a_sound_like_a[“dog”]
=>“woof”

Useful enough for inclusion?

Farrel

On Wed, 1 Mar 2006, Farrel L. wrote:

animal = [“dog”,“cat”,bird"]
sound = ["woof,“meow”,“cheep”]

make_a_sound_like_a = Hash.from_zipped_array(animal.zip(sound)
make_a_sound_like_a[“dog”]
=>“woof”

Useful enough for inclusion?

Farrel

it’s pretty dang easy to do already:

 harp:~ > cat a.rb
 animal, sound = %w[dog cat bird], %w[woof meow cheep]
 require 'yaml' and y Hash[*animal.zip(sound).flatten]


 harp:~ > ruby a.rb
 ---
 cat: meow
 bird: cheep
 dog: woof

kind regards.

-a

Is there anything they haven’t thought of in the API? They still keep
suprising me…

On Mar 1, 2006, at 2:31 PM, [email protected] wrote:

harp:~ > ruby a.rb

cat: meow
bird: cheep
dog: woof

A good opportunity for my annual plug for the flattenx extension :slight_smile:
(On RAA, still, I think.) It lets you flatten by any number of
levels, so that you can use that technique even with nested arrays.

It’s not too hard to allow nested Arrays in Hash construction even
without the library:

arr = [[:one, 1], [:two, %w{an Array}], [:three, 2]]
=> [[:one, 1], [:two, [“an”, “Array”]], [:three, 2]]

Hash[*arr.inject(Array.new) { |args, a| args.push(*a) }]
=> {:two=>[“an”, “Array”], :three=>2, :one=>1}

James Edward G. II

Hi –

On Wed, 1 Mar 2006, [email protected] wrote:

bird: cheep
dog: woof

A good opportunity for my annual plug for the flattenx extension :slight_smile:
(On RAA, still, I think.) It lets you flatten by any number of
levels, so that you can use that technique even with nested arrays.

David


David A. Black ([email protected])
Ruby Power and Light (http://www.rubypowerandlight.com)

“Ruby for Rails” chapters now available
from Manning Early Access Program! Ruby for Rails

[email protected] writes:

harp:~ > ruby a.rb

cat: meow
bird: cheep
dog: woof

A good opportunity for my annual plug for the flattenx extension :slight_smile:
(On RAA, still, I think.) It lets you flatten by any number of
levels, so that you can use that technique even with nested arrays.

Try to get that into 2.0, at least flatten_once. please.

Hi –

On Thu, 2 Mar 2006, James Edward G. II wrote:

require ‘yaml’ and y Hash[*animal.zip(sound).flatten]
levels, so that you can use that technique even with nested arrays.

It’s not too hard to allow nested Arrays in Hash construction even without
the library:

arr = [[:one, 1], [:two, %w{an Array}], [:three, 2]]
=> [[:one, 1], [:two, [“an”, “Array”]], [:three, 2]]
Hash[*arr.inject(Array.new) { |args, a| args.push(*a) }]
=> {:two=>[“an”, “Array”], :three=>2, :one=>1}

I may be in the minority, but I prefer:

Hash[*arr.flatten_once]

:slight_smile:

David


David A. Black ([email protected])
Ruby Power and Light (http://www.rubypowerandlight.com)

“Ruby for Rails” chapters now available
from Manning Early Access Program! Ruby for Rails

On Thu, 2 Mar 2006, Christian N. wrote:

require ‘yaml’ and y Hash[*animal.zip(sound).flatten]
levels, so that you can use that technique even with nested arrays.

Try to get that into 2.0, at least flatten_once. please.

agreed. however i’d strongly go with an api like

-a

Hi,

In message “Re: Hash.from_zipped_array”
on Thu, 2 Mar 2006 06:12:08 +0900, [email protected] writes:

|I may be in the minority, but I prefer:
|
| Hash[*arr.flatten_once]
|
|:-)

I’m not sure above is the best solution, but anyway giving #flatten a
level argument could be useful, so that you can do:

Hash[*arr.flatten(1)]

It’s more general, and even shorter.

						matz.

[email protected] wrote:

On Thu, 2 Mar 2006, Christian N. wrote:

Try to get that into 2.0, at least flatten_once. please.

agreed. however i’d strongly go with an api like

-a

Is that the sound of one API clapping? :wink:

Seriously, I cast my vote for flatten having an optional level argument.
(Couldn’t this go in 1.8.5. since it wouldn’t break anything?)

Hi –

On Thu, 2 Mar 2006, Yukihiro M. wrote:

I’m not sure above is the best solution, but anyway giving #flatten a
level argument could be useful, so that you can do:

Hash[*arr.flatten(1)]

It’s more general, and even shorter.

Actually the flattenx extension has both: flatten_once and flatten(n)
for any n. I can’t remember why I included flatten_once – I guess
because it seemed to be the most common case and I liked giving it its
own name.

David


David A. Black ([email protected])
Ruby Power and Light (http://www.rubypowerandlight.com)

“Ruby for Rails” chapters now available
from Manning Early Access Program! Ruby for Rails