Mam listę klawiszy: (1 2 3 4)
Jak przekonwertować listę numerów na mapę?
chcę mapę z wartościami określonymi na 0 tak: {1 0, 2 0, 3 0, 4 0}
. Jak mogę to zrobić?
Mam listę klawiszy: (1 2 3 4)
Jak przekonwertować listę numerów na mapę?
chcę mapę z wartościami określonymi na 0 tak: {1 0, 2 0, 3 0, 4 0}
. Jak mogę to zrobić?
Można zrobić coś takiego z funkcją zipmap:
(zipmap '(1 2 3 4) (repeat 0))
=> {4 0, 3 0, 2 0, 1 0}
zipmap pobiera listę kluczy i listę wartości i konwertuje je na mapie. Funkcja repeat
tworzy nieskończoną sekwencję 0s. zipmap
zatrzymuje się, gdy osiągnie koniec krótszej listy, więc po prostu nie przechodzi on dwa nieskończone sekwencje :)
Można również utworzyć funkcję z zipmap Jamesa:
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}
Bardziej ogólny wzór w tym celu należy użyć kolekcji (apply collection list
. Wszystkie zbiory Clojure mają "konstruktory" lub funkcje tworzenia, które pobierają zmienną liczbę argumentów i zwracają argumenty thows w pakiecie w kolekcji. jeśli twoje argumenty są już zapakowane w inną kolekcję, to zastosowanie jest wygodnym sposobem na wyjęcie ich z kolekcji i przekazanie do funkcji tworzenia jako argumenty.
To jest dużo więcej pracy. dlatego mamy funkcje opakowania, takie jak zipmap.
Wow nie wiedziałem o zipmap, to jest przydatna
zrobiłbym to jak to
(apply hash-map (interleave '(1 2 3 4) (repeat 0)))
tylko kolejny sposób, który zachowuje oryginalną kolejność kluczy (maksymalnie 9 klawiszy !):
(defn list-to-map [& n] (->> (map vector n (repeat 0)) (into (hash-map))))
(list-to-map 1 2 3 4)
=>{1 0, 2 0, 3 0, 4 0}
(list-to-map 4 3 2 1)
=>{4 0, 3 0, 2 0, 1 0}
Uwaga: mapy skrótów nie mają zdefiniowana kolejność więc nigdy nie należy polegać na tym. Zamawiający widzisz jest przypadkowe ze względu na realizację mapy hash. Zobacz, co się dzieje, kiedy spróbować z 9 pozycji. – TheQuickBrownFox
Tak masz rację. to zachowuje kolejność aż 9 item, więc ma tę samą kolejność aż do 9 argumentów! Czy znasz reas na? – amirteymuri
Użyj funkcji 'type', aby zobaczyć wynikowy typ przy 8 wpisach i 9. Wierzę, że Clojure używa" mapy tablicowej "dla mniejszych map jako optymalizacji wydajności. Używanie małych map do przekazywania bitów danych jest powszechnym przypadkiem, w którym nie ma potrzeby używania sprytnej maszyny z całej trwałej mapy hash. – TheQuickBrownFox
W mojej oryginalnej funkcji map, miałem dodatkową funkcję na kluczu. (map (fn [key] (key foo) ..) .. czy istnieje sposób włączenia tej funkcji do zipmap lub powinienem zastosować tę funkcję zanim użyję zipmap? – unj2
To nie powinno być problemem, ponieważ mapa zwraca Po prostu zamień "(1 2 3 4) na swoją funkcję mapowania: np. jeśli chcesz przekonwertować liczby na ciąg przed zrobieniem klucza: (zipmap (mapa # (str%)" (1 2 3 4)) (powtórz 0)) => {"4" 0, "3" 0, "2" 0, "1" 0} Czy to masz na myśli? –