返回一个元素,然后从Scheme中的列表中删除该元素

时间:2015-05-21 02:26:16

标签: scheme

我在Scheme中有一个包含数字的列表。我写了一个函数,它将一个数字和一个对象列表作为输入,并检查对象的置信度值是否与数字匹配。

一旦我得到其置信度值与给定数字匹配的对象,我想在返回后从列表中删除该对象。我该怎么做呢?到目前为止,这是我的代码:

(define (get-wordpair mi wordpairs)
    (define current-wp (car wordpairs))
    (define confidence (tv-conf (cog-tv current-wp)))
    (if (equal? confidence mi)
        current-wp
        (get-wordpair mi (cdr wordpairs))))

1 个答案:

答案 0 :(得分:1)

使用filter从列表中删除置信度值与给定数字匹配的对象:

(filter (lambda (e)
          (not (equal? (tv-conf (cog-tv e)) mi)))
        wordpairs)

相反,这个表达式将返回一个列表,其中的那些对象具有预期的置信度(可能有多个!)

(filter (lambda (e)
          (equal? (tv-conf (cog-tv e)) mi))
        wordpairs)

因此,如果可以在输入列表上执行两次传递,则调用两个表达式以获取具有所需对象的两个列表。要获得执行单次传递的更有效的解决方案,请检查解释器的文档以查看它是否提供partition过程,或使用SRFI-1

(let-values (((with-confidence no-confidence)
              (partition (lambda (e)
                           (equal? (tv-conf (cog-tv e)) mi))
                         wordpairs)))
  ; do something with the list of objects that have the
  ; required confidence (with-confidence) and the list of
  ; those which don't have the confidence (no-confidence)
  )