List 比较两个列表中的元素并添加不同的元素

List 比较两个列表中的元素并添加不同的元素,list,scheme,racket,sublist,List,Scheme,Racket,Sublist,我的问题是。我有一个子列表(slst1),其中包含来自另一个列表(lst)的随机元素。然后,我需要创建另一个(slst2),其中包含不在slst1中的lst元素,但是,当我比较它们时,结果不是我所期望的 电话将是: (split 0.3 lst) 其中“0.3”是我想要的列表的一部分 lst包含: ((a11 a12 a13 a14)(a21 a22 a32 a42) (a31 a32 a33 a34)) ((a21 a22 a23 a24)) 例如,slst1包含: ((a11 a12

我的问题是。我有一个子列表(slst1),其中包含来自另一个列表(lst)的随机元素。然后,我需要创建另一个(slst2),其中包含不在slst1中的lst元素,但是,当我比较它们时,结果不是我所期望的

电话将是:

(split 0.3 lst)
其中“0.3”是我想要的列表的一部分

lst包含:

((a11 a12 a13 a14)(a21 a22 a32 a42) (a31 a32 a33 a34))
((a21 a22 a23 a24))
例如,slst1包含:

((a11 a12 a13 a14)(a21 a22 a32 a42) (a31 a32 a33 a34))
((a21 a22 a23 a24))
那么,slst2应该包含:

((a11 a12 a13 a14) (a31 a32 a33 a34))
但是,在我的代码中,slst2始终包含与lst相同的项,而不仅仅是不同的项

这是我的代码:

(define (split proportion lst)
(let((ne (* proportion (length lst)))(slst1 '())(slst2 '()))
;Calculate first sublist
(when (> ne 0)
  (for ([i (inexact->exact ne)])
    (if (null? lst)
       (set! slst1 (list-ref lst (random (length lst))))
       (set! slst1 (list lst (list-ref lst (random (length lst)))))))
 ;Try to calculate second sublist 
   (for ([i (length lst)]
     #:when (not(member (list-ref lst i) slst1)))
  (set! slst2 (list slst2 (list-ref lst i)))
     )
 slst2)))

我是个无赖,所以任何建议都是完美的。感谢您的阅读/询问。

如果我理解正确,这将可以:

(define (split proportion lst)
  (define le (length lst))
  (define slst1 
    (for/list ([i (inexact->exact (round (* proportion le)))]) 
      (list-ref lst (random le))))
  (define slst2 
    (for/list ([e (in-list lst)] #:unless (member e slst1)) 
      e))
  (values slst1 slst2))
然后

请注意,slst1可以多次包含相同的成员,因此(长度slst1)+(长度slst2)可以大于(长度lst)。此外,如果成员在初始列表中出现多次,您可能会得到奇怪的结果

如果要避免这种情况,可以采取以下措施:

(define (split prop lst)
  (for/fold ((s1 '()) (s2 lst)) ([i (inexact->exact (round (* (length lst) prop)))])
    (define rn (random (length s2)))
    (values 
     (cons (list-ref s2 rn) s1)
     (append (take s2 rn) (drop s2 (add1 rn))))))

s1初始化为null,s2初始化为lst。每当我们在s1中添加一个元素时,我们就把它从s2中去掉。

你能举一个例子,说明你如何调用
split
,你得到的结果,以及预期的结果吗?你为
split
发布的代码是不合法的­-它无法编译,因为括号丢失了。约书亚·泰勒,对我来说,在Racket博士中,这是合法的。所以,请注意复制粘贴。uselpa:早上我举了一个例子,一个电话和预期的结果。对不起,这个问题不好。这是我的第一个^^^“不,佩德罗,你的代码没有编译,不完整(take random丢失)而且缩进很差(DrRacket可以自动为你做这件事),@JoshuaTaylor是正确的。@PedroL。如果必须,可以手动计算括号:在
(let((ne(*proportion(length lst)))(slst1'())(slst2'())(当(>ne 0)
时,
slst2
的变量绑定为
(slst2'())
。如果在那之后有另一个正确的参数,它将关闭
let
的变量列表。但是没有,所以
(当(>ne 0)…
是另一个变量的开始,它看起来不像你想要的。你说的“退出-1”是什么意思?我编辑了我的问题。这是可行的,但我需要完成这个函数(随机选取lst).无论如何,我想我可以修改它。还有其他建议吗?你为什么只使用for/fold来代替for?有什么不同吗?那么你对take random的定义是什么?你能发布代码吗?Re:
for/fold
-你用过优秀的球拍文档吗?在编辑器中,将光标放在for/fold上,然后按F1。还有另一个例子应该是把它弄清楚。