Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > replace values in hash

Reply
Thread Tools

replace values in hash

 
 
Jason Lillywhite
Guest
Posts: n/a
 
      11-05-2008
how would I iterate over a hash, such as

x = { 'a' => "hi", 'b' => nil, 'c' => "do"}

and replace nil values with 'foo' then return the hash again?
--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
 
Trans
Guest
Posts: n/a
 
      11-05-2008
On Nov 5, 1:53=A0am, Jason Lillywhite <(E-Mail Removed)>
wrote:
> how would I iterate over a hash, such as
>
> x =3D { 'a' =3D> "hi", 'b' =3D> nil, 'c' =3D> "do"}


x.each{ |k,v| x[k] =3D 'foo' unless v }

However, it is not always sane to alter something while you are
iterating over it. So,

h =3D {}
x.each{ |k,v| h[k] =3D v.nil? ? v : 'foo' }
x.replace(h)

Or use Facets Enumerable#mash (alias #graph)

require 'facets/enumerable/mash'

x =3D x.mash{ |k,v| [k, v.nil? ? v : 'foo'] }

http://facets.rubyforge.org/doc/api/...e.html#M000429

7.

 
Reply With Quote
 
 
 
 
Jason Lillywhite
Guest
Posts: n/a
 
      11-05-2008
Thank you!

However, I am getting undefined method 'mash' even though I do require
'facets/enumerable/mash'

am I missing something?
--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
Sarcar, Shourya C (GE Healthcare)
Guest
Posts: n/a
 
      11-05-2008
=20

> -----Original Message-----
> From: http://www.velocityreviews.com/forums/(E-Mail Removed) [(E-Mail Removed)]=20
> Sent: Wednesday, November 05, 2008 12:24 PM
> To: ruby-talk ML
> Subject: replace values in hash
>=20
> how would I iterate over a hash, such as
>=20
> x =3D { 'a' =3D> "hi", 'b' =3D> nil, 'c' =3D> "do"}



h.keys.each {|d| h[d] =3D "foo" if h[d] =3D=3D nil}

 
Reply With Quote
 
Trans
Guest
Posts: n/a
 
      11-05-2008


On Nov 5, 2:54=A0am, Jason Lillywhite <(E-Mail Removed)>
wrote:
> Thank you!
>
> However, I am getting undefined method 'mash' even though I do require
> 'facets/enumerable/mash'
>
> am I missing something?


Don't think so. It's working fine for me.

What version of Ruby and Facets and what platform are you running?

T.

 
Reply With Quote
 
Brian Adkins
Guest
Posts: n/a
 
      11-05-2008
Jason Lillywhite <(E-Mail Removed)> writes:

> how would I iterate over a hash, such as
>
> x = { 'a' => "hi", 'b' => nil, 'c' => "do"}
>
> and replace nil values with 'foo' then return the hash again?


~/temp$ cat -b temp.rb
1 require 'pp'

2 class Hash
3 def replace_value old, new
4 self.inject({}) do |result,pair|
5 k, v = pair[0], pair[1]
6 result[k] = (v == old) ? new : v
7 result
8 end
9 end
10 end

11 x = { 'a' => "hi", 'b' => nil, 'c' => "do", :d => nil }
12 pp x
13 y = x.replace_value(nil, 'foo')
14 pp y
~/temp$ ruby temp.rb
{"a"=>"hi", "b"=>nil, :d=>nil, "c"=>"do"}
{"a"=>"hi", "b"=>"foo", "c"=>"do", :d=>"foo"}

--
Brian Adkins
http://www.lojic.com/
http://lojic.com/blog/
 
Reply With Quote
 
Trans
Guest
Posts: n/a
 
      11-05-2008


On Nov 5, 10:31=A0am, Trans <(E-Mail Removed)> wrote:
> On Nov 5, 2:54=A0am, Jason Lillywhite <(E-Mail Removed)>
> wrote:
>
> > Thank you!

>
> > However, I am getting undefined method 'mash' even though I do require
> > 'facets/enumerable/mash'

>
> > am I missing something?

>
> Don't think so. It's working fine for me.
>
> What version of Ruby and Facets and what platform are you running?


For anyone who is interested, here's the definition (and some side
notes about how it evolved).

def mash(&yld)
if yld
inject({}) do |h, *kv| # Used to be inject({}) do |h,kv|
r =3D *yld[*kv] # The *-op works different from to_a on
single element hash!!!
nk, nv =3D *r # Used to be nk, nv =3D
*yld[*kv].to_a.flatten
h[nk] =3D nv
h
end
else
Enumerator.new(self,:mash) # Used to be Hash[*self.to_a]
end
end

T.

 
Reply With Quote
 
James Herdman
Guest
Posts: n/a
 
      11-10-2008
[Note: parts of this message were removed to make it a legal post.]

Not bad. Let's tighten it up a little:

class Hash
def replace_value(old, new)
self.inject({}) do |result, (key, existing_value)|
result[key] = (value == old) ? new : existing_value
result
end
end
end

This isn't bad, but you wouldn't want to do this for large Hashes since you
end up copying the original.

James

On Wed, Nov 5, 2008 at 12:38 PM, Brian Adkins <(E-Mail Removed)> wrote:

> Jason Lillywhite <(E-Mail Removed)> writes:
>
> > how would I iterate over a hash, such as
> >
> > x = { 'a' => "hi", 'b' => nil, 'c' => "do"}
> >
> > and replace nil values with 'foo' then return the hash again?

>
> ~/temp$ cat -b temp.rb
> 1 require 'pp'
>
> 2 class Hash
> 3 def replace_value old, new
> 4 self.inject({}) do |result,pair|
> 5 k, v = pair[0], pair[1]
> 6 result[k] = (v == old) ? new : v
> 7 result
> 8 end
> 9 end
> 10 end
>
> 11 x = { 'a' => "hi", 'b' => nil, 'c' => "do", :d => nil }
> 12 pp x
> 13 y = x.replace_value(nil, 'foo')
> 14 pp y
> ~/temp$ ruby temp.rb
> {"a"=>"hi", "b"=>nil, :d=>nil, "c"=>"do"}
> {"a"=>"hi", "b"=>"foo", "c"=>"do", :d=>"foo"}
>
> --
> Brian Adkins
> http://www.lojic.com/
> http://lojic.com/blog/
>
>


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
hash of hash of hash of hash in c++ rp C++ 1 11-10-2011 04:45 PM
Hash#select returns an array but Hash#reject returns a hash... Srijayanth Sridhar Ruby 19 07-02-2008 12:49 PM
Hash#values and Hash#keys order Alex Fenton Ruby 1 04-15-2006 05:45 AM
Replace substring in all values of a hash array? Brian McCauley Perl Misc 4 05-23-2005 10:48 PM
replace words in string with hash values wana Perl Misc 6 11-30-2004 05:37 AM



Advertisments