6
votes

Comment convertissez-vous une liste de numéros en une carte?

J'ai une liste de clés: (1 2 3 4)

Je veux une carte avec les valeurs définies sur 0 comme ceci: {1 0, 2 0, 3 0, 4 0} . Comment puis-je faire ça?


0 commentaires

5 Réponses :


15
votes

Vous pouvez faire quelque chose comme ceci avec la fonction ZipMap:

(zipmap '(1 2 3 4) (repeat 0))
=> {4 0, 3 0, 2 0, 1 0}


2 commentaires

Dans ma fonction de carte d'origine, j'ai eu une fonction supplémentaire sur la clé. (MAP (FN [TOLE] (touche FOO) ..)


Cela ne devrait pas être un problème car la carte renvoie une séquence. Il suffit de remplacer '(1 2 3 4) avec la fonction de votre carte: par exemple. Si vous vouliez convertir les chiffres en une chaîne avant de les faire la clé: (ZipMap (carte # (STR%) '(1 2 3 4)) (répétez 0)) => {"4" 0, "3" 0, "3" 0, "3" 0 , "2" 0, "1" 0} Est-ce ce que vous voulez dire?



1
votes

Vous pouvez également créer une fonction avec James 'ZipMap:

Clojure=> (defn map-to-n [n] (zipmap (range 1 n) (repeat 0)))
#'user/map-to-n
Clojure=> (map-to-n 10)
{9 0, 8 0, 7 0, 6 0, 5 0, 4 0, 3 0, 2 0, 1 0}


0 commentaires

1
votes

Le modèle plus général pour cela est d'utiliser (liste de collecte d'appliquer pour créer la collection. Les collections de clojure ont tous des "constructeurs" ou des fonctions de création qui prennent un nombre variable d'arguments et retournent les arguments Fenoulé dans la collection. Si vos arguments sont déjà enveloppés dans une autre collection, appliquer est un moyen pratique de les sortir de la collection et de les transmettre à la fonction de création comme arguments.

C'est beaucoup plus de travail. C'est pourquoi nous avons des fonctions d'emballage comme ZipMap.


0 commentaires

1
votes

wow je ne savais pas à propos de ZipMap, c'est utile

Je l'aurais fait comme ceci xxx


0 commentaires

0
votes

Un autre moyen, ce qui conserve l'ordre d'origine des touches (jusqu'à 9 clés!):

(liste de lecture defn à la carte [& n] (- >> (carte vecteur n (répéter 0)) (dans (mappe de hachage))))

(liste-to-map 1 2 3 4) => {1 0, 2 0, 3 0, 4 0}

(liste-to-map 4 3 2 1) => {4 0, 3 0, 2 0, 1 0}


3 commentaires

Surveillez: Les cartes de hash n'ont pas d'ordre défini, vous ne devriez donc jamais compter sur cela. La commande que vous voyez est coïncidente en raison de la mise en œuvre des cartes de hachage. Voyez ce qui se passe lorsque vous essayez avec 9 articles.


Oui, tu as raison. Il conserve la commande jusqu'à la 9. article, il a donc le même ordre jusqu'à 9 arguments! Connaissez-vous la raison?


Utilisez la fonction type pour voir le type résultant à 8 entrées et 9. Je pense que Clojure utilise une "carte de tableau" pour des cartes plus petites comme optimisation des performances. L'utilisation de petites cartes pour passer des bits de données autour est un cas d'utilisation commun où il n'est pas nécessaire d'utiliser les machines intelligentes de la carte de hachage persistante complète.