Hash.from_zipped_array

F

Farrel Lifson

Hi folks,

Array has got a pretty cool method zip which 'zips' two arrays together lik=
e so:

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

That's also what you get when you call to_a on a Hash like
{1=3D>2,2=3D>4,3=3D>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]] =3Dkey_value_pair[1]
hash
end
end
end

# Example usage
animal =3D ["dog","cat",bird"]
sound =3D ["woof,"meow","cheep"]

make_a_sound_like_a =3D Hash.from_zipped_array(animal.zip(sound)
make_a_sound_like_a["dog"]
=3D>"woof"

Useful enough for inclusion?

Farrel
 
A

ara.t.howard

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

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
 
F

Farrel Lifson

Is there anything they haven't thought of in the API? They still keep
suprising me...
 
D

dblack

Hi --

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

A good opportunity for my annual plug for the flattenx extension :)
(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! http://www.manning.com/books/black
 
J

James Edward Gray II

Hi --

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

A good opportunity for my annual plug for the flattenx extension :)
(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 = [[:eek:ne, 1], [:two, %w{an Array}], [:three, 2]] => [[:eek:ne, 1], [:two, ["an", "Array"]], [:three, 2]]
Hash[*arr.inject(Array.new) { |args, a| args.push(*a) }]
=> {:two=>["an", "Array"], :three=>2, :eek:ne=>1}

James Edward Gray II
 
D

dblack

Hi --

Hi --

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

A good opportunity for my annual plug for the flattenx extension :)
(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 = [[:eek:ne, 1], [:two, %w{an Array}], [:three, 2]] => [[:eek:ne, 1], [:two, ["an", "Array"]], [:three, 2]]
Hash[*arr.inject(Array.new) { |args, a| args.push(*a) }]
=> {:two=>["an", "Array"], :three=>2, :eek:ne=>1}

I may be in the minority, but I prefer:

Hash[*arr.flatten_once]

:)


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! http://www.manning.com/books/black
 
A

ara.t.howard

Hi --

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

A good opportunity for my annual plug for the flattenx extension :)
(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*.

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


-a
 
Y

Yukihiro Matsumoto

Hi,

In message "Re: Hash.from_zipped_array"
on Thu, 2 Mar 2006 06:12:08 +0900, (e-mail address removed) 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.
 
D

dblack

Hi --

Hi,

In message "Re: Hash.from_zipped_array"
on Thu, 2 Mar 2006 06:12:08 +0900, (e-mail address removed) 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.

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! http://www.manning.com/books/black
 
J

Joel VanderWerf

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


-a

Is that the sound of one API clapping? ;)

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?)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,202
Messages
2,571,057
Members
47,665
Latest member
salkete

Latest Threads

Top