2015-04-06 53 views
1

是否有任何與list-ref相反的東西,而不是選擇某些值添加到列表中,它會從列表中取值?list-ref的對面? (球拍)

我基本上要做到以下幾點

(list 1 2 3 4 5 6 7) (list 3 6 7) -> (list 1 2 4 5) 

凡在列表中有兩個值也會從列表中選擇一個刪除。 (首選)

由於我總是從1到n的列表開始, 第二個列表還可以表示列表1上的數字應該刪除的位置/位置。 (不太喜歡)

我想創建一個代碼,它將操縱其他函數來提供這些列表,所以請清楚每個列表在代碼中的位置,因爲我有時候會感到困惑,因爲如果有人使用XY和z等多個拉姆達,局部定義等


我這裏有一些東西,做的我想的正好相反,我一直在試圖改變它所以不是輸出的元素在y上的x,它給出了不在y上的x的元素。

(define (selection x y) 
    (filter (lambda (e2) 
      (ormap (lambda (e1) (equal? e1 e2)) 
        y)) 
      x)) 

例如:

 (list 1 2 3 4 5 6 7 8 9 10) 
     (list 2 4 6 8 10)) 
    -> (list 2 4 6 8 10)) 

任何人對如何改變輸出什麼,我需要什麼想法?

+1

什麼? 「list-ref」與「選擇某些值添加到列表中」沒有多大關係。 – 2015-04-06 01:47:36

+0

我的描述沒有多大意義,我只是想說我想在某種意義上做它的反面。 – 2015-04-06 01:49:34

回答

2

這聽起來像你使用list s作爲集。你也可以使用球拍set S,並使用set-subtract功能:

#lang racket 

(set-subtract (set 1 2 3 4 5 6 7) 
       (set 3 6 7)) 
;; => (set 1 2 4 5) 
+0

我還沒有學過套。你有什麼辦法使用抽象/高階函數來做到這一點? – 2015-04-06 02:14:34

2

remove會做我猜的伎倆。

> (remove* (list 1 2) (list 1 2 3 2 4 5 2)) 
'(3 4 5) 

您可以閱讀doc here

+0

刪除*可能工作,但問題是它沒有在我卡住的語言級別定義。你知道如何定義使用遞歸或抽象嗎? – 2015-04-06 02:47:02

+0

是的,它不應該很難。嘗試一下並用你編寫的代碼復出。提示:在*構建結果列表時使用'cons'。你必須檢查第一個列表中的每一項,每一個第二列。每次你走過第一個列表時,使用'cdr'來縮短下一次遞歸調用。 。 – 2015-04-06 16:07:13

0

這裏有一個簡單的遞歸函數的實現你想要什麼:

(define remove-list-from-list (lambda (list remlist) 
    (cond 
     [(null? list) '()] 
     [(member (car list) remlist) (remove-list-from-list (cdr list) remlist)] 
     [else (cons (car list) (remove-list-from-list (cdr list) remlist))]))) 

現在你可以使用它像這樣:

> (remove-list-from-list (list 1 2 3 4 5 6 7) (list 3 6 7)) 
'(1 2 4 5)