Нахождение индексов каждого элемента в многомерном массиве в ruby - PullRequest
2 голосов
/ 07 апреля 2010

Например

:a=[["hello", "world"], ["good", "lord"], ["hello", "lord"]]

Мне нужно найти и записать индексы каждого слова по отношению к супер-массиву. то есть

hello => 0,2
world => 0
lord => 1,2.

вот мой снимок, но он очень любительский и длинный.

all_tokens=tokens.flatten
all_tokens.each do|keyword|                                                                                      
    tokens.each do|token_array|
        if token_array.include?keyword
            x << i
        end
        i=i+1
    end    
    y[k] = x.clone
    y=y.clear
end 

Ответы [ 6 ]

4 голосов
/ 07 апреля 2010

Незначительное улучшение (imho) в решении vava:

tokens = [["hello", "world"], ["good", "lord"], ["hello", "lord"]]

tokens_hash = Hash.new{|h, k| h[k] = []}

tokens.each_with_index do |subarr, i|
  subarr.each do |word|
    tokens_hash[word] << i
  end
end
2 голосов
/ 07 апреля 2010
a.each_with_index.inject({}){|acc,(elem,i)|
  elem.each{|e|
    acc[e] ||= []
    acc[e] << i
  }
  acc
}
#=> {"hello"=>[0, 2], "world"=>[0], "good"=>[1], "lord"=>[1, 2]}
2 голосов
/ 07 апреля 2010
ret = []
a.each_with_index {|x, i| if x.include?(keyword) then ret << i end }
1 голос
/ 07 апреля 2010
a=[["hello", "world"], ["good", "lord"], ["hello", "lord"]]
result = Hash.new{|k,v| k[v] = []}
a.each_with_index{|b,i| b.each{|c| result[c] << i} }
result
#=> {"good"=>[1], "world"=>[0], "lord"=>[1, 2], "hello"=>[0, 2]}
1 голос
/ 07 апреля 2010

Только для улыбок, функциональное решение:

#!/usr/bin/ruby1.8

a = [["hello", "world"], ["good", "lord"], ["hello", "lord"]]

b = a.flatten.uniq.inject({}) do |hash, word|
  hash.merge(word => a.each_with_index.collect do |list, i|
               list.index(word) && i
             end.compact)
end

p b    # => {"world"=>[0], "good"=>[1], "lord"=>[1, 2], "hello"=>[0, 2]}
1 голос
/ 07 апреля 2010
tokens = [["hello", "world"], ["good", "lord"], ["hello", "lord"]]

tokens_hash = Hash.new([])

tokens.each_with_index do |subarr, i|
    subarr.each do |word|
        tokens_hash[word] = tokens_hash[word] + [i]
    end
end

p tokens_hash #=>{"good"=>[1], "world"=>[0], "lord"=>[1, 2], "hello"=>[0, 2]}

Мое решение будет сканировать всю структуру только один раз.

...