Drehen Sie eine Hash-Karte in Clojure um

8

Ich bin Clojure sehr neu und habe ein interessantes Problem für euch Clojure-Gurus. Ich arbeite durch das Buch "Programming Collective Intelligence" und versuche, die Beispiele in Clojure zu kodieren (das Buch hat sie alle in Python). Im ersten Kapitel haben wir einen Hash-Map-Aufbau von Filmkritikern und die Rankings, die sie verschiedenen Filmen gegeben haben. Es sieht so aus:

%Vor%

Das Problem ist das. Wie man das umdrehen kann, damit ich eine Hash-Karte bekomme, die so aussieht:

%Vor%

Was wäre Ihre Aufgabe, dies zu erreichen?

    
Dave Kincaid 02.09.2011, 21:29
quelle

3 Antworten

17
%Vor%     
amalloy 02.09.2011, 23:04
quelle
6
%Vor%

Dies setzt voraus, dass alle Schlüssel von Interesse in den inneren Karten auf der ersten inneren Karte vorhanden sind. Wenn dies nicht korrekt ist, müsste (-> m first val keys) durch etwas ersetzt werden, das eine Sammlung aller Schlüssel von Interesse zurückgibt, z. (->> m (map values) (mapcat keys)) .

Die Idee besteht darin, eine Karte der Form {inner-key {outer-key the-value-at-inner-key-in-the-map-at-outer-key}} zu erstellen und sie dann entsprechend zusammenzufassen.

Der Rückgabewert auf der Karte im Fragetext ist wie angegeben.

Nun, das obige erzeugt viele Zwischenstrukturen, was ein Performance-Problem sein kann. Wenn Geschwindigkeit wichtig ist, können Sie zu loop und Transienten wechseln:

%Vor%

Die Idee ist die gleiche, wenn sie schwerer vom Code zu unterscheiden ist.

    
Michał Marczyk 02.09.2011 22:31
quelle
3

Ich kann folgendes vorschlagen: Wir haben eine Karte - Sammlung von Einträgen. Drehe jeden Eintrag nach außen und füge sie zusammen: Anfänglich:

%Vor%

Inverse jeden Eintrag:

%Vor%

Beschreibe sie:

%Vor%

Und sie verschmelzen sie zu einer Karte:

%Vor%

Code:

%Vor%

Also bekommen wir Map, (es ist die Sammlung von Vektoren [Schlüsselwert]), inverse jeden Eintrag (Vektor [Schlüsselwert]). Jetzt haben wir Sammlung von Sammlungen von Vektoren, concat sie zu einer Sammlung. Und schließlich fügen wir mit reduce jeden Vektor hinzu, um ihn zu kartieren.

Ich nehme an, dass es eine elegantere Lösung gibt, aber meine funktioniert auch.

    
Nikita Beloglazov 02.09.2011 22:15
quelle

Tags und Links