【问题标题】:ruby hash swap values from one key to anotherruby 哈希将值从一个键交换到另一个键
【发布时间】:2011-10-19 17:21:43
【问题描述】:

是否有人对我如何将哈希中的值重新映射到不同的键有 Ruby 建议?说我有这个

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

并且想要得到这个(即,“present”、“first”和“subject”、“second”的值已被切换):

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

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

【问题讨论】:

  • 我猜你有一个重新映射的算法,所以,在我看来,最好的方法是自己为重新映射编写一个脚本。我真的没有看到这方面的挑战
  • 你没有描述哪个是钥匙开关策略...

标签: ruby hash map key-value inject


【解决方案1】:
# 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}

【讨论】:

  • 谢谢。这是一个更大问题的一部分,我正忙于这个重新映射。我认为这个解决方案会很好地工作。太棒了!
  • @user877961 如果您不需要更多提示,请标记答案
【解决方案2】:

你没有提供足够的上下文,但你可以做类似的事情

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

编辑:from.values_rearranged_in_any_way_you_like 应该是 from.values 以您需要的方式排序(我假设您确实有一种想要的方式来对它们进行重新排列)。

【讨论】:

    【解决方案3】:

    嗯,这是一个简单的小算法。我不知道它的效率如何,但它应该可以工作。

    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
    

    【讨论】:

    • 为什么不使用 self[key1], self[key2] = self[key2], self[key1]
    【解决方案4】:

    你可以这样做:

    keys = @hash.keys
    values = @hash.values
    

    然后你可以交换'values'数组(或'keys'数组)的条目

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

    ...

    或者如果您只想将它​​们上移一项:

    values.rotate (ruby 1.9)
    

    您还可以执行 push/pop、shift/unshift 操作或对值进行排序 要创建哈希,请执行以下操作:

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

    【讨论】:

      【解决方案5】:

      保持简单,使用合并:

      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​​ 中重新映射大量哈希值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-21
        • 1970-01-01
        • 1970-01-01
        • 2017-12-11
        • 2012-06-16
        • 1970-01-01
        • 2017-12-18
        相关资源
        最近更新 更多