2014-11-04 159 views
-1
散列變換陣列

我有以下散列:組和在紅寶石

hash = {"col1"=>["FALSE", "TRUE", "FALSE", "TRUE"], 
"col2"=>["FALSE", "FALSE", "TRUE", "TRUE"], 
"Freq"=>[36146, 2614, 2607, 1692]} 

我想以上通過COL1分組它來創建兩個散列出一個陣列;第一個散列將包含:name =>「FALSE」,第二個散列將包含:name =>「TRUE」。

目標是獲得以下哈希數組。下面第一個哈希中的value1和value2對應於col2中歸因於FALSE和TRUE的頻率。

[{name=> FALSE, value1 => 36146, value2 => 2607 }, 
{name=> TRUE, value1 => 2614, value2 => 1692 }] 

謝謝!

+0

需要一些修改'name','value1'和'value2'必須轉換爲字符串(' 「名」 ')或符號(':name')。必須將「FALSE」和「TRUE」轉換爲字符串,符號或「false」或「true」對象。看到我的想法答案。 – 2014-11-05 05:20:35

+0

您需要修改以澄清問題。如果我的理解是正確的,例如:「我希望創建一個包含兩個哈希的數組,第一個哈希包含':name =>」FALSE「'和另外兩個鍵 - 值對。在hash [「col1」]'值等於「FALSE」(這裏偏移了'0'和'2')的值的偏移處設置hash [「col2」]'('hash [「Freq」]')那將是'「FALSE」=> 36146「'和'」TRUE「=> 2607')。除了用於hash [「col1」]'等於'「TRUE」(在偏移量爲1和3)的元素外,第二個散列的構造方式類似。「隨意使用這些 – 2014-11-05 05:43:36

+0

當我說需要更正和澄清時,我的意思是你需要編輯你的問題,因爲目前有三張投票結束,你應該這樣做* post haste *。 – 2014-11-05 16:22:25

回答

0

我相信這會產生你想要的散列數組。我改變了一些值的名稱,以使結果更易於理解。

hash = {"col1"=>["FALSE", "TRUE", "FALSE", "TRUE"], 
     "col2"=>["FALSE", "FALSE", "TRUE", "TRUE"], 
     "Freq"=>[36146, 2614, 2607, 1692]} 

arr = hash["col1"].zip(hash["col2"], hash["Freq"]) 
    #=> [["FALSE", "FALSE", 36146], ["TRUE", "FALSE", 2614], 
    # ["FALSE", "TRUE", 2607], ["TRUE", "TRUE", 1692]] 

arr.each_with_object({}) do |(tf1,tf2,freq),h| 
    (h[tf1] ||= {})[:name] = tf1+?1 
    h[tf1][tf2+?2] = freq 
end.values 
    #=> [{:name=>"FALSE1", "FALSE2"=>36146, "TRUE2"=>2607}, 
    # {:name=>"TRUE1", "FALSE2"=>2614, "TRUE2"=>1692}] 

Enumerable#zip用於產生陣列arr其值如上所示。

enum = arr.each_with_object({}) 
    #=> #<Enumerator: [["FALSE", "FALSE", 36146], ["TRUE", "FALSE", 2614], 
    # ["FALSE", "TRUE", 2607], ["TRUE", "TRUE", 1692]]:each_with_object({})> 

我們可以枚舉轉換爲陣,看看什麼樣的價值觀也將傳遞到它的塊:

enum.to_a 
    #=> [[["FALSE", "FALSE", 36146], {}], [["TRUE", "FALSE", 2614], {}], 
    # [["FALSE", "TRUE", 2607], {}], [["TRUE", "TRUE", 1692], {}]] 

注意,經過哈希的元素值的第一個(在每個AS {}所示)在元素傳遞到塊時將是非空的。

第一陣列,

[["FALSE", "FALSE", 36146], {}] 

被傳遞到塊,分解並分配給塊的變量:

tf1 = "FALSE" 
tf2 = "FALSE" 
freq = 36146 
h = {} 

然後,我們執行以下操作:

(h[tf1] ||= {})[:name] = tf1+?1 
    # (h["FALSE"] ||= {})[:name] = "FALSE"+?1 
    # h["FALSE"] = h["FALSE"] || {})[:name] = "FALSE1" 
    # h["FALSE"] = nil || {})[:name] = "FALSE1" 
    # h["FALSE"] = {})[:name] = "FALSE1" 
    # h => {"FALSE"=>{:name=>"FALSE1"}} 

h[tf1][tf2+?2] = freq 
    # h["FALSE"]["FALSE"] = 36146 
    # h => {"FALSE"=>{:name=>"FALSE1", "FALSE"=>36146}} 

在將enum的每個其他元素傳入塊後,我們有:

h 
    #=> {"FALSE"=>{:name=>"FALSE1", "FALSE2"=>36146, "TRUE2"=>2607}, 
    # "TRUE"=> {:name=>"TRUE1", "FALSE2"=>2614, "TRUE2"=>1692}} 

的最後一步是提取這個散列值:

h.values 
    #=> [{:name=>"FALSE1", "FALSE2"=>36146, "TRUE2"=>2607}, 
    # {:name=>"TRUE1", "FALSE2"=>2614, "TRUE2"=>1692}] 
+0

each_with_object的大用例。感謝您的及時迴應。 – deniz 2014-11-05 16:12:12