Mam listę [2 3 5], której chcę użyć do usunięcia elementów z innej listy, na przykład [1 2 3 4 5], aby uzyskać [1 4].Jak usunąć wiele przedmiotów z listy?
dzięki
Mam listę [2 3 5], której chcę użyć do usunięcia elementów z innej listy, na przykład [1 2 3 4 5], aby uzyskać [1 4].Jak usunąć wiele przedmiotów z listy?
dzięki
user=> (use 'clojure.set)
nil
user=> (difference (set [1 2 3 4 5]) (set [2 3 5]))
#{1 4}
referencyjny:
Czy coś jest nie tak z tym rozwiązaniem? –
Wektor nie jest zbiorem. Kolejność wektoryzacji nie jest zachowywana po przekonwertowaniu jej na zestaw. Jeśli rozumie pytanie prawidłowo (różnica (zestaw [9 2 3 4 5]) (ustaw [2 3 5])) powraca # {4 9} w którym powinny powrócić [9 4] i (różnica (set [1 1 2 3 4 5]) (set [2 3 5])) powinien wrócić [1 1 4], a nie # {1 4} Jeśli chciał ustawić semantykę prawdopodobnie użyłby zestawu do zaczynać się. – Jonas
Dzięki, Jonas. Prawdopodobnie masz rację, nie chcąc ustawić semantyki. –
Spróbuj tego:
(let [a [1 2 3 4 5]
b [2 3 5]]
(remove (set b) a))
która zwraca (1 4)
.
Nawiasem mówiąc, funkcja remove
pobiera predykat i kolekcję i zwraca sekwencję elementów, które nie spełniają predykatu (zestaw, w tym przykładzie).
... która jest O (n + m) – Thumbnail
jak działa funkcja '(set)' jako predykat dla 'remove'? Czy ktoś może to wyjaśnić? Nie wymaga predykatu, aby zwrócić false dla niektórych elementów w coll? – amirteymuri
Zestaw jest także funkcją, która zwróci wartość, która jest podana, jeśli ta wartość jest sama w sobie, lub zero, jeśli nie jest. Jeśli użyjesz tej funkcji jako predykatu, zwrócona wartość stanie się prawdziwa, lub nil zwrócony stanie się fałszem. Dzieje się tak dlatego, że w Clojure zero to "falsey". –
Można to zrobić samemu coś podobnego:
(def a [2 3 5])
(def b [1 2 3 4 5])
(defn seq-contains?
[coll target] (some #(= target %) coll))
(filter #(not (seq-contains? a %)) b)
; (3 4 5)
wersji opartej na bibliotece reducers mogą być:
(require '[clojure.core.reducers :as r])
(defn seq-contains?
[coll target]
(some #(= target %) coll))
(defn my-remove
"remove values from seq b that are present in seq a"
[a b]
(into [] (r/filter #(not (seq-contains? b %)) a)))
(my-remove [1 2 3 4 5] [2 3 5])
; [1 4]
EDITDodany nast-zawiera? kod
Witaj Mikołaju, może brakuje mi punktu, ale AFAIK zawiera? tak naprawdę nie sprawdza "zawartości" raczej sprawdza indeks, sprawdź ten przykład; (zawiera? [7 2 3 4 5 6] 6) ;; false, nie ma elementu w indeksie 6, chociaż jest element 6. –
Dziękuję za wskaźnik. Zupełnie zapomniałam. Dodano kod dla seq-zawiera? funkcjonować. –
Oto moje podejście bez użycia zestawów;
[] oznacza wektor nie jest listą – Roskoto