Эффективное по времени построение частичного инвертированного индекса

Мне нужно построить частичное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]]} & /@ 
                     (Union@Flatten@Last@Transpose@list)

Но это выглядит слишком запутанным для такой легкой задачи, кажется слишком медленным, и я должен быть в состоянии справиться с Легионом.

Тест-драйв для сравнения ваших результатов:

words = DictionaryLookup[];
abWords = DictionaryLookup["ab" ~~ ___];
l = {#, RandomChoice[abWords, RandomInteger[{1, 30}]]} & /@ words[[1 ;; 3000]];
First@Timing@iI[l]
(*
-> 5.312
*)

Итак, есть идеи для ускорения?

Ответы на вопрос(1)

Ваш ответ на вопрос