Ho bisogno di costruire un parziale Inverted Index
. Qualcosa di simile:Edificio ad indice parziale parzialmente invertito
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}}}
*)
Penso che sia abbastanza chiaro cosa fa. Nell'elenco di input, {x, y ...} sono unici, mentre {a, b, c, ..} non lo sono. L'uscita dovrebbe essere ordinata per #[[1]]
.
In questo momento, sto facendo questo:
iI[list_List] := {#, list[[Position[list, #][[All, 1]]]][[All, 1]]} & /@
([email protected]@[email protected]@list)
ma sembra troppo complicata per un compito così facile, sembra troppo lento, e dovrei essere in grado di far fronte con Legion.
un test drive per confrontare i risultati:
words = DictionaryLookup[];
abWords = DictionaryLookup["ab" ~~ ___];
l = {#, RandomChoice[abWords, RandomInteger[{1, 30}]]} & /@ words[[1 ;; 3000]];
[email protected]@iI[l]
(*
-> 5.312
*)
Quindi, tutte le idee per un aumento di velocità?
Un passo verso la gloria http://i.stack.imgur.com/EqlqO.png :) –
Davvero bello. 'La discussione dell'elenco non è nemmeno necessaria; potresti fare qualcosa come 'iI [list_]: = Ordina [Reap [Sow @@@list, _, List] [[2]]] per renderlo ancora più veloce. – Heike
@Heike Effettivamente, grazie. Quando stavo sviluppando il codice, in qualche modo pensavo che dovesse essere "Sow [# 2, # 1] &", che, se fosse vero, richiedeva "Thread". Quando ho capito che l'ordine è diretto, ho dimenticato di rimuoverlo. Modifica per utilizzare la tua versione. –