ruby散列将值从一个键交换到另一个键

ruby散列将值从一个键交换到另一个键,ruby,hash,map,key-value,inject,Ruby,Hash,Map,Key Value,Inject,有人对如何将散列中的值重新映射到不同的键有Ruby建议吗?说我有这个 from => {"first"=>30, "wanted"=>27, "second"=>45, "subject"=>68, "present"=>85} 想要得到这个,也就是说,现在,第一个和主题,第二个的值已经被切换: to => {"first"=>85, "wanted"=>27, "second"=>68, "subject"=>45, "pr

有人对如何将散列中的值重新映射到不同的键有Ruby建议吗?说我有这个

from => {"first"=>30, "wanted"=>27, "second"=>45, "subject"=>68, "present"=>85} 
想要得到这个,也就是说,现在,第一个和主题,第二个的值已经被切换:

to => {"first"=>85, "wanted"=>27, "second"=>68, "subject"=>45, "present"=>30}

我想在大型数据集上执行此操作。

您可以执行以下操作:

keys = @hash.keys
values = @hash.values
然后可以交换“值”数组或“键”数组的条目

values[0], values[4] = values[4], values[0]

或者,如果您只想将em向上移动一项:

values.rotate (ruby 1.9)
您还可以执行推送/弹出、移位/取消移位操作或对值进行排序 要创建哈希,请执行以下操作:

hsh = Hash.new
keys.size.times do |i|
  hsh[ keys[i] ] = values[i]
end

你可以这样做:

keys = @hash.keys
values = @hash.values
然后可以交换“值”数组或“键”数组的条目

values[0], values[4] = values[4], values[0]

或者,如果您只想将em向上移动一项:

values.rotate (ruby 1.9)
您还可以执行推送/弹出、移位/取消移位操作或对值进行排序 要创建哈希,请执行以下操作:

hsh = Hash.new
keys.size.times do |i|
  hsh[ keys[i] ] = values[i]
end

这里有一个简单的小算法。我不知道它的效率有多高,但它应该能起作用

class Hash
    def swap_vals!(new_key_maps)
        new_key_maps.each do |key1, key2|
            temp = self[key1]
            self[key1] = self[key2]
            self[key2] = temp
        end
    end
end

这里有一个简单的小算法。我不知道它的效率有多高,但它应该能起作用

class Hash
    def swap_vals!(new_key_maps)
        new_key_maps.each do |key1, key2|
            temp = self[key1]
            self[key1] = self[key2]
            self[key2] = temp
        end
    end
end

您没有提供足够的上下文,但您可以这样做

 to = Hash[from.keys.zip(from.values_rearranged_in_any_way_you_like)]

编辑:from.values\u reasonated\u in \u any \u way \u您喜欢的应该是from.values按您需要的方式排序我假设您确实有一种想要的方式来对它们进行排序以进行重新排序。

您没有提供足够的上下文,但您可以这样做

 to = Hash[from.keys.zip(from.values_rearranged_in_any_way_you_like)]

编辑:from.values\u reasonated\u in \u any \u way \u您喜欢的应该是from.values按您需要的方式排序我假设您确实有一种想要的方式对它们进行排序以进行重新排列。

保持简单,使用合并:

from => {"first"=>30, "wanted"=>27, "second"=>45, "subject"=>68, "present"=>85}
to => {"first"=>85, "wanted"=>27, "second"=>68, "subject"=>45, "present"=>30}

from.merge(to)
# => {"first"=>85, "wanted"=>27, "second"=>68, "subject"=>45, "present"=>30}

但不确定是否应该在ruby中重新映射大量哈希。

保持简单,使用merge:

from => {"first"=>30, "wanted"=>27, "second"=>45, "subject"=>68, "present"=>85}
to => {"first"=>85, "wanted"=>27, "second"=>68, "subject"=>45, "present"=>30}

from.merge(to)
# => {"first"=>85, "wanted"=>27, "second"=>68, "subject"=>45, "present"=>30}
# this is your starting hash:
from = {"first"=>30, "wanted"=>27, "second"=>45, "subject"=>68, "present"=>85}
# this is your replacement mapping:
map = {'present' => 'first', 'subject' => 'second'}
# create complete map by inverting and merging back
map.merge!(map.invert)
# => {"present"=>"first", "subject"=>"second", "first"=>"present", "second"=>"subject"} 
# apply the mapping to the source hash:
from.merge(map){|_, _, key| from[key]}
# => {"first"=>85, "wanted"=>27, "second"=>68, "subject"=>45, "present"=>30}

不过,我不确定您是否应该在ruby中重新映射大量哈希。

我猜您有一个用于重新映射的算法,因此,我认为,最好的方法是自己编写一个用于重新映射的脚本。我不认为这是一个挑战,你不描述哪一个是密钥切换策略……我猜你有一个重新映射的算法,所以,从我的观点来看,最好的方法是自己为重新映射编写一个脚本。我真的不认为这有什么挑战,你不描述哪种是钥匙开关策略……为什么不使用self[key1],self[key2]=self[key2],self[key1],self[key2]=self[key2],self[key1]谢谢。这是一个更大的问题的一部分,我正忙于重新映射。我认为这个解决方案会很有效。太棒了@用户877961如果不需要更多信息,请标记答案谢谢。这是一个更大的问题的一部分,我正忙于重新映射。我认为这个解决方案会很有效。太棒了@用户877961如果您不需要更多提示,请标记答案
# this is your starting hash:
from = {"first"=>30, "wanted"=>27, "second"=>45, "subject"=>68, "present"=>85}
# this is your replacement mapping:
map = {'present' => 'first', 'subject' => 'second'}
# create complete map by inverting and merging back
map.merge!(map.invert)
# => {"present"=>"first", "subject"=>"second", "first"=>"present", "second"=>"subject"} 
# apply the mapping to the source hash:
from.merge(map){|_, _, key| from[key]}
# => {"first"=>85, "wanted"=>27, "second"=>68, "subject"=>45, "present"=>30}