2010-12-10 2 views
0

Das ist also eine triviale, aber hoffentlich lustige Frage. Ich muss einen Hash mit identischen Schlüsseln und Werten aus den Schlüsseln eines vorhandenen Hash machen. Hier ist ein Beispiel Eingabe zusammen mit meinem besten Versuch so weit:Wie verwende ich die Schlüssel aus einem Hash, um einen neuen Hash zu erstellen, bei dem der Wert jedes Schlüssels der Schlüssel selbst ist?

input = {'cat' => 'meow', 'dog' => nil} 
Hash[*input.keys.map {|k| [k,k]}.flatten] 
#=> {'cat' => 'cat', 'dog' => 'dog'} 

Ich glaube nicht, dass dies besonders lesbar ist, so dass ich frage mich, ob es eine bessere war, ausdruck Syntax, dies zu tun in Ruby, insbesondere einen das könnte für zukünftige Programmierer, die den Code pflegen, besser lesbar sein? Diese

ist, wie ich die gleiche Sache in Python zu tun, und ich finde es etwas besser lesbar sein:

dict([[a,a] for a in input]) 

Aber das könnte nur sein, weil ich zu lesen Python gewohnt bin!

Auf der Suche nach Vorschlägen, die mit Ruby 1.8.6 funktionieren, ist die Version, die ich beschränkt bin.

+0

möglich duplicate von [Wie kopiere ich einen Hash in Ruby?] (Http://stackoverflow.com/questions/4157399/how-do-i-copy-a-hash-in-ruby) –

+0

Die Eingabe und die gewünschte Ausgabe zeigt, dass ich NICHT frage, wie man einen Hash kopiert, ich transformiere ihn in einen neuen Hash basierend auf einer Funktion. Ich würde gerne Änderungen am Titel der Frage akzeptieren, die das deutlicher machen würden, aber es ist ein kniffliges Problem, dies knapp auszudrücken. – Prairiedogg

+0

"Verwenden Sie die Schlüssel aus einem Hash, um einen neuen Hash zu erstellen, bei dem der Wert jedes Schlüssels selbst ist." – zetetic

Antwort

3
h = {'cat' => 'meow', 'dog' => nil} 
#=> {"cat"=>"meow", "dog"=>nil} 
Hash[h.keys.map{|k| [k,k]}] 
#=> {"cat"=>"cat", "dog"=>"dog"} 

Hier ist ein anderer, ein bisschen schmutzig Weg (und ich denke, es ist in 1.8.6 funktioniert):

h.merge(h){|k,v,v| k} 
+0

Ausgezeichnete Antwort, aber ich habe vergessen zu erwähnen, dass ich auf Ruby 1.8.6 beschränkt bin, die anscheinend nicht diese "Hash" -Erstellungssyntax hat. Ihre Antwort funktioniert perfekt in Ruby 1.8.7, aber scheitert in Ruby 1.8.6 – Prairiedogg

+0

Ah, ich verstehe. Schauen Sie sich "Backports" an, dann würde ich erwarten, dass diese Funktion dort enthalten ist. –

+0

Es funktioniert und Punkte für die Kürze ... was ist "schmutzig" darüber? Gibt es da eine Falle, über die ich besorgt sein sollte? – Prairiedogg

2
Hash[input.keys.zip(input.keys)] #=> {"cat"=>"cat", "dog"=>"dog"} 

Oder mit inject:

input.keys.inject({}) { |h, k| h[k] = k ; h } #=> {"cat"=>"cat", "dog"=>"dog"} 

Die zweiten auch funktioniert in 1.8.6.

Verwandte Themen