删除/比较字符串值与列表 - 方案

时间:2010-11-14 17:41:22

标签: scheme racket

我正在尝试从包含这些成员的列表中删除字符串中存在的成员。

示例:

字符串:"ABC"

列表:('A 'B 'C 'D)

待办事项:从列表中删除字符串的第一个元素

从字符串中删除元素:

我使用以下方法将其转换为列表:

(car (string->list"ABC") 

这给了我字符列表和第一个元素:#\A

但我不知道如何从列表中删除它,因为两个值都不比较:字符和列表值。

尝试了这种不起作用的奇怪方法:

((eq? (make-string 1 (car (string->list"ABC"))) (car (list 'A 'B 'C 'D))))

不起作用,因为字符串值与第一个列表值不比较。

我如何比较&从原始列表中删除第一个字符串字母??

2 个答案:

答案 0 :(得分:2)

  

错误,因为列表不能包含字符串元素值:

事实并非如此。列表可以包含字符串以及字符作为其元素,没有问题。您收到错误的原因是您在字符串上使用car,而不是列表。

(car (list->string(list(car (string->list "ABC")))))

好的,在这里你正在调用(string->list "ABC"),它会给你一个包含角色A,B和C的列表。现在你正在调用car并获得角色A.到目前为止没有问题。

然后你在该角色上调用list获取一个仅包含字符A的列表,然后使用list-string将其转换为字符串"A"。这仍然完全合法。但是,您在字符串car上调用"A",这是错误,因为您在字符串上调用car,但car只接受列表(嗯,实际上任何一对)作为其论点。

由于您尝试将A与('A 'B 'C 'D)的第一个元素(即'A(即符号)进行比较,您可能希望将字符串"A"转换为符号{ {1}}(或符号'A进入字符串'A)。为此,您可以使用"A"功能代替string->symbol

获得符号car后,您可以使用A功能轻松将其从列表中删除:

filter

答案 1 :(得分:0)

这样的事情:

(define lst '(#\a #\b #\c #\d))
(define str (string->list "abc"))

(define (reduce-list lst str)
  (cond
     [(empty? str) lst]
     [else (reduce-list (remove (first str) lst) (rest str))]
  )
)

(reduce-list lst str)

结果:

(list #\d)