On Nov 17, 3:50 pm, Aryk Grosz <tennisbum2...@hotmail.com> wrote:
Whenever Im coding I usually come across having to create a new hash
from the key/value pairs of another hash.
For example,
hash = {:a => 1, :b => 2, :c => 3}
I want to do something like this
hash.from_keys(:a,:b) => {:a=> 1, :b=> 2}
Is there something like this already? Perhaps in the facets library? I
looked and couldn't find anything.
If anybody thinks that I shouldnt even be getting into this situation in
the first place, please let me know that as well.
--
Posted viahttp://www.ruby-forum.com/.
I tried to resist making this a one-liner and went for the clean and explicit way
class Hash
def from_keys(*keys)
selected_values = self.values_at(*keys)
selected_key_values = keys.zip(selected_values)
Hash[*selected_key_values.flatten]
end
end
In ruby1.9, Hash#select returns another Hash. But you'd still be
iterating the 'wrong way' (that is, iterating through the hash and doing
a linear search through the keys)
Personally I'd go with:
class Hash
def from_keys(*keys)
keys.inject({}) { |h,k| h[k] = self[k] if has_key?(k); h }
end
end
keys.each_with_object({}) { |k,h| h[k] = self[k] if has_key?(k) }
which is more keystrokes but maybe the teeniest bit more efficient. But
I hate each_with_object on the principle that its arguments are the
opposite way round to inject
Yeah, or the simpler: hash.reject {|k,v| ![:a,:b].include?(k)}
···
On Nov 17, 4:46 pm, Chris Shea <cms...@gmail.com> wrote:
On Nov 17, 3:50 pm, Aryk Grosz <tennisbum2...@hotmail.com> wrote:
> Whenever Im coding I usually come across having to create a new hash
> from the key/value pairs of another hash.
> For example,
> hash = {:a => 1, :b => 2, :c => 3}
> I want to do something like this
> hash.from_keys(:a,:b) => {:a=> 1, :b=> 2}
> Is there something like this already? Perhaps in the facets library? I
> looked and couldn't find anything.
> If anybody thinks that I shouldnt even be getting into this situation in
> the first place, please let me know that as well.
> --
> Posted viahttp://www.ruby-forum.com/.
Hmm... I thought there was a built in method for that. Here's one
way:
Einar Magnús Boson
+354-661 1649
einarmagnus@tistron.se
einar.boson@gmail.com
···
On 17.11.2008, at 23:46 , Chris Shea wrote:
On Nov 17, 3:50 pm, Aryk Grosz <tennisbum2...@hotmail.com> wrote:
Whenever Im coding I usually come across having to create a new hash
from the key/value pairs of another hash.
For example,
hash = {:a => 1, :b => 2, :c => 3}
I want to do something like this
hash.from_keys(:a,:b) => {:a=> 1, :b=> 2}
Is there something like this already? Perhaps in the facets library? I
looked and couldn't find anything.
If anybody thinks that I shouldnt even be getting into this situation in
the first place, please let me know that as well.
--
Posted viahttp://www.ruby-forum.com/.
Hmm... I thought there was a built in method for that. Here's one
way:
On Nov 18, 3:31 am, Luc Heinrich <l...@honk-honk.com> wrote:
On 17 nov. 08, at 23:50, Aryk Grosz wrote:
> hash.from_keys(:a,:b) => {:a=> 1, :b=> 2}
I tried to resist making this a one-liner and went for the clean and
explicit way
class Hash
def from_keys(*keys)
selected_values = self.values_at(*keys)
selected_key_values = keys.zip(selected_values)
Hash[*selected_key_values.flatten]
end
end
and now I see that I was stupd.
heh. nevermind <.<
Einar Magnús Boson
+354-661 1649
einarmagnus@tistron.se
einar.boson@gmail.com
···
On 18.11.2008, at 01:34 , Einar Magnús Boson wrote:
On 17.11.2008, at 23:46 , Chris Shea wrote:
On Nov 17, 3:50 pm, Aryk Grosz <tennisbum2...@hotmail.com> wrote:
Whenever Im coding I usually come across having to create a new hash
from the key/value pairs of another hash.
For example,
hash = {:a => 1, :b => 2, :c => 3}
I want to do something like this
hash.from_keys(:a,:b) => {:a=> 1, :b=> 2}
Is there something like this already? Perhaps in the facets library? I
looked and couldn't find anything.
If anybody thinks that I shouldnt even be getting into this situation in
the first place, please let me know that as well.
--
Posted viahttp://www.ruby-forum.com/.
Hmm... I thought there was a built in method for that. Here's one
way:
selected = find.inject({}) {
>result, key|
val=hash[key]
result[key]=val if val
result }
p selected
# >> {:str=>"test", :a=>1, :d=>4}
given: f, h = find.size, hash.size
This method is O(f) because hash lookup is O(1)
The other way it's O(f*h).
so if the hash is big it should make a difference.
If the elements always are just a few it doesn't really matter.
einarmagnus
···
On 18.11.2008, at 05:00 , Todd Benson wrote:
On Mon, Nov 17, 2008 at 7:44 PM, Einar Magnús Boson > <einarmagnus@tistron.se> wrote:
I'm not apologizing for the missing result[key] on the lhs, though I
know it's pretty important to many to have working code in a message.
Anyone with a half a brain knows what I meant, but just to be clean...
h = Hash[:a, 1, :b, 2]
p [:missing_key].inject({}) {|result, key| result[key] = h[key]; result}
=> {:missing_key => nil}
In any case, reducing a hash (being selective) I think is best done
using a reject with a negative in the block (as per Chris Shea's
second example).
Todd
···
On Mon, Nov 17, 2008 at 11:04 PM, Todd Benson <caduceass@gmail.com> wrote:
On Mon, Nov 17, 2008 at 7:44 PM, Einar Magnús Boson > <einarmagnus@tistron.se> wrote:
This is what I meant to do, a lot more efficient to look up the values
you're lookin for than looping through all keys for every element.
selected = find.inject({}) {
>result, key|
val=hash[key]
result[key]=val if val
result }
p selected
# >> {:str=>"test", :a=>1, :d=>4}
given: f, h = find.size, hash.size
This method is O(f) because hash lookup is O(1)
The other way it's O(f*h).
Good point. The use of #inject, though, may cloud that performance analysis.
so if the hash is big it should make a difference.
If the elements always are just a few it doesn't really matter.
I'm an #inject sort of guy so I like the way you approach this. But,
there must be a reason why you don't prefer the negative #reject that
seems to work for most people.
I might benchmark this, but I think object creation and destruction
might outweigh the O(f*h).
Todd
···
On Mon, Nov 17, 2008 at 11:23 PM, Einar Magnús Boson <einarmagnus@tistron.se> wrote:
On 18.11.2008, at 05:00 , Todd Benson wrote:
On Mon, Nov 17, 2008 at 7:44 PM, Einar Magnús Boson >> <einarmagnus@tistron.se> wrote: