【问题标题】:Checking if lists share one or more elements in Racket检查列表是否共享 Racket 中的一个或多个元素
【发布时间】:2017-12-21 04:39:48
【问题描述】:

我有两个列表,lst1lst2。我想定义一个函数来检查它们是否共享某些元素。例如:

  • (share-some-elements? '(a b) '(a c)) ⇒ 是的
  • (share-some-elements? '(a b) '(d e f)) ⇒ 错误
  • (share-some-elements? '(a b) '(a b d e)) ⇒ 是的

我有一个实现:

(define (share-some-elements? lst1 lst2)
  (ormap (λ (x) (member x lst1)) lst2))

检查lst2 中的每个元素是否是lst1 的成员,如果其中任何一个是则返回true。

我的问题是:

  1. 还有哪些其他方法可以做到这一点?
  2. 如何扩展它以支持任意数量的列表? IE。
    • (all-share-some-elements? '(a b) '(a c) '(a d)) ⇒ 是的
    • (all-share-some-elements? '(a b) '(a c) '(b d)) ⇒ 错误
    • (all-share-some-elements? '(a b) '(a c) '(b d a)) ⇒ 是的

关于如何在 python 中的两个列表上执行此操作有一个类似的问题: Checking if two lists share at least one element,这并不能完全回答我的问题。

【问题讨论】:

  • 您可以使用set-intersection,它适用于多个列表。如果交集不是空的,那么你有共同的元素。

标签: scheme lisp racket


【解决方案1】:

这两个问题都可以使用带有可变数量参数的单个过程来解决。假设至少通过了一个列表,我们有:

(define (all-share-some-elements? . lists)
  (not (null? (apply set-intersect lists))))

解释:

  • 我们在所有列表中应用set-intersect
  • 如果在交集之后的结果是非空的,那么列表共享至少一个共同的元素。

使用你的例子:

(all-share-some-elements? '(a b) '(a c))
=> #t
(all-share-some-elements? '(a b) '(d e f))
=> #f
(all-share-some-elements? '(a b) '(a b d e))
=> #t

(all-share-some-elements? '(a b) '(a c) '(a d))
=> #t
(all-share-some-elements? '(a b) '(a c) '(b d))
=> #f
(all-share-some-elements? '(a b) '(a c) '(b d a))
=> #t

【讨论】:

  • (not (null? (apply set-intersect lists))) 有什么问题?
  • @uselpa 什么都没有,只是我不知道set-intersect 在普通列表上工作。现在已经修复了:)
猜你喜欢
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
  • 2019-05-16
  • 2021-08-24
  • 1970-01-01
  • 2022-01-06
  • 2014-07-29
  • 2012-08-01
相关资源
最近更新 更多