Поиск позиции каждого слова в подмассиве многомерного массива - PullRequest
0 голосов
/ 20 апреля 2010

У меня есть массив:

tokens = [["hello","world"],["hello","ruby"]]
all_tokens = tokens.flatten.uniq # all_tokens=["hello","world","ruby"]

Теперь мне нужно создать два массива, соответствующих all_tokens, где первый массив будет содержать позицию каждого слова в подмассиве токенов. I.E Выход:

[[0,0],[1],[1]] # (w.r.t all_tokens)

Чтобы было понятно, он гласит: индекс "привет" равен 0 и 0 в 2 под-массивах токенов.

И второй массив содержит индекс каждого слова w.r.t tokens.I.E Вывод:

[[0,1],[0],[1]]

Чтобы было понятно, он читает, индекс привет 0,1. I.E "привет" в индексах 0 и 1 массива токенов.

Ура!

Ответы [ 2 ]

1 голос
/ 20 апреля 2010

Ваш подход звучит трудно поддерживать. Если вы останетесь на своем текущем пути, вы получите tokens массив массивов, массив уникальных токенов (all_tokens) и два дополнительных массива для отслеживания позиций уникальных токенов в оригинальной структуре tokens.

Альтернативный подход - начать с наиболее естественного способа хранения уникальных токенов: хеш . В этом хеше вы также можете хранить информацию о местоположении. Таким образом, вся информация путешествует вместе.

Для этого может быть более изящный способ, но вот простая реализация:

tokens = [["hello","world"],["hello","ruby"]]

token_info     = {}
ordered_tokens = []

tokens.each_with_index do |group, i|
    group.each_with_index do |t, j|
        unless token_info.has_key?(t)
            token_info[t] = {:i => [], :j => []}
            ordered_tokens.push(t)
        end
        token_info[t][:i].push(i)
        token_info[t][:j].push(j)
    end
end

ordered_tokens.each do |t|
    p t, token_info[t]
end
0 голосов
/ 20 апреля 2010

Я согласен с FM, но это создаст ваш первый массив:

tokens = [["hello","world"],["hello","ruby"]]
all_tokens = tokens.flatten.uniq

sublist_indices = all_tokens.collect do |token|
  tokens.inject([]) do |indices, list|
    indices += list.each_with_index.select {|pair| pair[0] == token}.map {|pair| pair[1]}
  end
end  # => [[0, 0], [1], [1]]

Остаток оставлен как упражнение.

...