2 Stimmen

Finden von Indizes für jedes Element in einem mehrdimensionalen Array in Ruby

Zum Beispiel

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

Ich muss die Indizes der einzelnen Wörter in Bezug auf das Super-Array finden und aufzeichnen. d.h.

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

Hier ist meine Aufnahme, aber sie ist sehr amateurhaft und langwierig.

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

4voto

Marc-André Lafortune Punkte 75645

Leichte Verbesserung (imho) gegenüber der Lösung von 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

2voto

Tuomas Pelkonen Punkte 7667
ret = []
a.each_with_index {|x, i| if x.include?(keyword) then ret << i end }

2voto

Mladen Jablanović Punkte 42360
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]}

1voto

vava Punkte 23765
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]}

Bei meiner Lösung wird die gesamte Struktur nur einmal gescannt.

1voto

Wayne Conrad Punkte 95828

Nur so zum Spaß, eine funktionelle Lösung:

#!/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]}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X