Adding keys to a hash in a loop

Hi all,

I’m trying to essentially accomplish this behavior:

output.each do |item|
output_hash << {item.name => []}
end

So that I can end up with:

{“first_set” => [], “second_set” => [], “third_set” => [], … }

I know the first block of code won’t work, but it’s just to illustrate
what it is I wish to accomplish. Can anyone help me out? Thanks.

On 01.02.2010 18:35, Jack B. wrote:

I know the first block of code won’t work, but it’s just to illustrate
what it is I wish to accomplish. Can anyone help me out? Thanks.

Erm, how would you put a key value pair into a Hash without a loop?

http://www.ruby-doc.org/core/classes/Hash.html

Kind regards

robert

Robert K. wrote:

Erm, how would you put a key value pair into a Hash without a loop?

This is the loop…

output.each do |item|
output_hash << {item.name => []}
end

Iterate through items in the “output” array and create a key for the
“output_hash” hash using the value of “item.name” as the key, and an
empty array as the value for that key.

I know the output_hash << won’t work, that’s why I’m asking how I can go
about it. I was just using that as a sort of pseudo-code to get my point
across.

Marnen Laibow-Koser wrote:

The same way you assign to a hash element outside a loop:
output_hash[item.name] = value . << is only useful with arrays, not
hashes.

Thanks, I know << is only for arrays. Using = will only end up with one
key and not all 10 that I’m trying to get.

Jack B. wrote:

Robert K. wrote:

Erm, how would you put a key value pair into a Hash without a loop?

This is the loop…

output.each do |item|
output_hash << {item.name => []}
end

Iterate through items in the “output” array and create a key for the
“output_hash” hash using the value of “item.name” as the key, and an
empty array as the value for that key.

I know the output_hash << won’t work, that’s why I’m asking how I can go
about it. I was just using that as a sort of pseudo-code to get my point
across.

The same way you assign to a hash element outside a loop:
output_hash[item.name] = value . << is only useful with arrays, not
hashes.

Best,

Marnen Laibow-Koser
http://www.marnen.org
[email protected]

Jack B. wrote:

Marnen Laibow-Koser wrote:

The same way you assign to a hash element outside a loop:
output_hash[item.name] = value . << is only useful with arrays, not
hashes.

Thanks, I know << is only for arrays. Using = will only end up with one
key and not all 10 that I’m trying to get.

Wrong. Do it inside the loop, for each key in turn. Try it!

Best,

Marnen Laibow-Koser
http://www.marnen.org
[email protected]

Matthew P. wrote:

The suggestion is to use = in a normal hash assignment:

There we go! Thanks!

Jack B. wrote:

Hi all,

I’m trying to essentially accomplish this behavior:

output.each do |item|
output_hash << {item.name => []}
end

Apart from the other suggestions, you can do:

output.each do |item|
output_hash.merge!(item.name => [])
end

On 2010/02/01, at 13:07, Jack B. wrote:

Marnen Laibow-Koser wrote:

The same way you assign to a hash element outside a loop:
output_hash[item.name] = value . << is only useful with arrays, not
hashes.

Thanks, I know << is only for arrays. Using = will only end up with one
key and not all 10 that I’m trying to get.

Hi Jack.

The suggestion is not to just replace << with = like this:

output.each do |item|
output_hash = {item.name => []}
end

The suggestion is to use = in a normal hash assignment:

output.each do |item|
output_hash[item.name] = []
end

HTH,
Matt

Brian C. wrote:

Jack B. wrote:

Hi all,

I’m trying to essentially accomplish this behavior:

output.each do |item|
output_hash << {item.name => []}
end

Apart from the other suggestions, you can do:

output.each do |item|
output_hash.merge!(item.name => [])
end

Yes. Although merging a single-key hash seems silly, and creates extra
objects…

Best,
–Â
Marnen Laibow-Koser
http://www.marnen.org
[email protected]

2010/2/2 yermej [email protected]:

value instead of individually initializing the values. Based on your
sample, you can likely use:

output_hash = Hash.new {|hash, key| hash[key] = Array.new}

I’m guessing this is what Robert was hinting at.

Actually, no. :slight_smile: But you are right, this is certainly an option in
many cases. It all depends on the situation and we do know nothing
about the “surrounding” code.

I rather tried to help Jack solve this for himself since it’s not too
tricky. Providing the full solution is not always the best choice
IMHO.

Kind regards

robert

On Feb 1, 11:35 am, Jack B. [email protected] wrote:

Hi all,

I’m trying to essentially accomplish this behavior:

output.each do |item|
output_hash << {item.name => []}
end

Depending on how you’ll be using output_hash, you might use a default
value instead of individually initializing the values. Based on your
sample, you can likely use:

output_hash = Hash.new {|hash, key| hash[key] = Array.new}

I’m guessing this is what Robert was hinting at.