Мне нужно построить частичный Inverted Index
. Что-то вроде:
l = {{x, {h, a, b, c}}, {y, {c, d, e}}}
iI[l]
(*
-> {{a, {x}}, {b, {x}}, {c, {x, y}}, {d, {y}}, {e, {y}}, {h, {x}}}
*)
Я думаю, что это довольно ясно, что он делает. В списке входных данных {x, y...} уникальны, а {a, b, c,..} - нет. Вывод должен быть упорядочен с помощью #[[1]]
.
Сейчас я делаю это:
iI[list_List] := {#, list[[Position[list, #][[All, 1]]]][[All, 1]]} & /@
([email protected]@[email protected]@list)
Но он выглядит слишком запутанным для такой легкой задачи, кажется слишком медленным, и я должен быть в состоянии справиться с Легионом.
Тест-драйв для сравнения ваших результатов:
words = DictionaryLookup[];
abWords = DictionaryLookup["ab" ~~ ___];
l = {#, RandomChoice[abWords, RandomInteger[{1, 30}]]} & /@ words[[1 ;; 3000]];
[email protected]@iI[l]
(*
-> 5.312
*)
Итак, любые идеи для ускорения?