Necesito construir un Inverted Index
parcial. Algo como:Time efficiency Parcial Inverted Index building
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}}}
*)
Creo que es bastante claro lo que hace. En la lista de entrada, {x, y ...} son únicos, mientras que {a, b, c, ..} no lo son. La salida debe ser ordenada por #[[1]]
.
En este momento, estoy haciendo esto:
iI[list_List] := {#, list[[Position[list, #][[All, 1]]]][[All, 1]]} & /@
([email protected]@[email protected]@list)
pero parece demasiado complicado para una tarea tan fácil, parece demasiado lento, y yo debería ser capaz de hacer frente a la legión.
Una unidad de prueba para comparar sus resultados:
words = DictionaryLookup[];
abWords = DictionaryLookup["ab" ~~ ___];
l = {#, RandomChoice[abWords, RandomInteger[{1, 30}]]} & /@ words[[1 ;; 3000]];
[email protected]@iI[l]
(*
-> 5.312
*)
Así, cualquier idea para un aumento de velocidad?
Un paso hacia la gloria http://i.stack.imgur.com/EqlqO.png :) –
Agradable de hecho. 'Enhebrar 'la lista ni siquiera es necesario; usted podría hacer algo como 'iI [list_]: = Ordenar [Reap [Sow @@@ list, _, List] [[2]]]' para hacerlo aún más rápido. – Heike
@Heike De hecho, gracias. Cuando estaba desarrollando código, de alguna manera primero pensé que debería ser 'Sow [# 2, # 1] &', que, de ser cierto, requería 'Thread'. Cuando me di cuenta de que el pedido es directo, olvidé eliminarlo. Editará para usar su versión. –