【问题标题】:Check if an element is within a sequence检查元素是否在序列中
【发布时间】:2009-07-21 08:51:47
【问题描述】:

如何检查一个元素是否包含在一个序列中?我期待一些 Seq.contains,但我找不到它。谢谢

编辑: 或者,为了更简单的任务,如何区分两个序列?比如,获取一个列表中不属于另一个(或不属于)的所有元素?

【问题讨论】:

标签: f#


【解决方案1】:

简单一点:

let contains x = Seq.exists ((=) x)

【讨论】:

  • 请问(=) 的语法是什么?
  • 它只是一个运算符,但用括号括起来就像一个普通函数。运算符由不被识别为函数名称的特殊字符(如“=”)组成。例如:let z = x + y // is the same like let z = (+) x y
【解决方案2】:

序列存在

let testseq = seq [ 1; 2; 3; 4 ]
let equalsTwo n = (n = 2)
let containsTwo = Seq.exists equalsTwo testseq

【讨论】:

    【解决方案3】:

    Set是你的朋友:

    let a = set [0;1;2;3]
    let b = set [2;3;4;5]
    let c = a - b
    let d = b - a
    let e = Set.intersect a b
    let f = a + b
    > 
    val c : Set<int> = seq [0; 1]
    val d : Set<int> = seq [4; 5]
    val e : Set<int> = seq [2; 3]
    val f : Set<int> = seq [0; 1; 2; 3; ...]
    

    丹尼

    【讨论】:

      【解决方案4】:

      Seq.exists 再次存在,但语法略有不同 -

      let testseq = seq [ 1; 2; 3; 4 ]
      let testn = 2
      testseq |> Seq.exists (fun x -> x = testn)
      

      参见 MSDN F#:Seq.exists 函数:https://msdn.microsoft.com/en-us/library/ee353562.aspx

      那里还有很多其他的好东西!

      【讨论】:

        【解决方案5】:

        (另一个问题,另一个答案。)

        这行得通,但我认为这不是最典型的方式——(你需要等到美国醒来才能发现):

        let s1 = seq [ 1; 2; 3; 4 ]
        let s2 = seq [ 3; 4; 5; 6 ]
        
        seq {
            for a in s1 do
                if not (Seq.exists (fun n -> n = a) s2) then
                    yield a
                }
        

        【讨论】:

        • 您拥有的是一个 O(nm) 算法,其中 n 是第一个列表的长度,m 是第二个列表的长度。当 n 和 m 彼此近似相等时,您不妨考虑这是一种 O(n^2) 算法。我认为有比这更有效的方法来计算集合的交集。
        猜你喜欢
        • 1970-01-01
        • 2021-12-17
        • 2014-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        相关资源
        最近更新 更多