我在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))))
答案 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)
)