【问题标题】:Sort by elements in a list in Racket按 Racket 列表中的元素排序
【发布时间】:2020-11-12 06:35:02
【问题描述】:

问题

只是为了澄清:这并不是真正意义上的排序。我得到了一个函数(sort-sym lst symbol)。该函数接受一个 (listof (listof symbol)) 和一个符号以将其转换为 (list (listof (listof symbol)) (list (listof symbol)))。仅仅在这里陈述问题并没有太大帮助,所以让我们直接进入示例。

示例

列表

(define example (list 
                     (list 'chocolate 'sweet 'expensive)                          
                     (list 'crocodile 'hostile 'big 'heavy) 
                     (list 'brick 'heavy 'red) 
                     (list 'chocolate 'bitter 'dark)))

如果我输入(sort-sym example'chocolate),列表会这样排序:

(list
(list (list 'chocolate 'sweet 'expensive)
      (list 'chocolate 'bitter 'dark))

(list (list 'crocodile 'hostile 'big 'heavy)
      (list 'brick 'heavy 'red)))

如果输入是(sort-sym example'crocodile),那么列表将是

(list
    (list (list 'crocodile 'hostile 'big 'heavy))

    (list (list 'chocolate 'sweet 'expensive)
          (list 'chocolate 'bitter 'dark)
          (list 'brick 'heavy 'red)))

请注意,所有包含单词 'chocolate 的列表都放在一个列表中,所有没有单词的列表都放在另一个列表中。在这种情况下,顺序无关紧要。

另外:两个列表之间的空间只是为了使代码更清晰。

代码

所以我对这个有点迷茫。但是我尝试了一些东西,例如,我尝试使用过滤器。

(define (sort-examples lst sym)
  (local [(define (sym-equal? other-sym) (symbol=? other-sym sym))]
    (cond [(empty? lst) empty]
          [else (cons (filter sym-equal? (first lst))
                      (sort-examples (rest lst) sym))])))

但这并没有真正的帮助,因为我试图保留列表,而不是从中删除元素。我可以对此有一些指导吗?谢谢。

【问题讨论】:

  • 球拍是否支持SRFI-1的partition?还是编写自己的版本是练习的重点?
  • 我猜想这个练习的重点是发现如果你把它分成两个问题,“根据谓词对列表进行分区”和“定义谓词”会变得多么容易。跨度>

标签: sorting scheme racket


【解决方案1】:

正如 cmets 中所暗示的,在 Racket 中使用 partition 内置过程将是一件简单的事情:

(define (sort-sym lst sym)
  (let-values (((match no-match)
                (partition (lambda (sl) (symbol=? (first sl) sym))
                           example)))
    (list match no-match)))

也可以通过执行两个filter 操作来解决这个问题,虽然效率会降低:

(define (sort-sym lst sym)
  (list (filter (lambda (sl) (symbol=? (first sl) sym)) lst)
        (filter (lambda (sl) (not (symbol=? (first sl) sym))) lst)))

对于给定的示例,无论哪种方式都可以按预期工作:

(define example
  '((chocolate sweet expensive)                          
    (crocodile hostile big heavy) 
    (brick heavy red) 
    (chocolate bitter dark)))

(sort-sym example 'chocolate)
=> '(((chocolate sweet expensive) (chocolate bitter dark))
     ((crocodile hostile big heavy) (brick heavy red)))

(sort-sym example 'crocodile)
=> '(((crocodile hostile big heavy))
     ((chocolate sweet expensive) (chocolate bitter dark) (brick heavy red)))

【讨论】:

  • 感谢您的回答。这真的很有帮助。尽管我被允许使用 lambda,但我很想知道除此之外是否还有其他选择。如果有,您能否简要解释一下它是如何工作的?
  • 好吧,您基本上可以实现自己的filter 版本:接收输入列表的过程,并将列表中满足条件的元素作为输出返回。一般的想法是,您应该将问题分成更小的部分并编写帮助程序来解决每个部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-27
相关资源
最近更新 更多