如何从F#中的列表列表中筛选具有相同尾部的列表

时间:2014-10-03 20:37:02

标签: list filter f#

我的列表如下所示。

    [[1L; 1L]; [8L; 8L]; [27L; 2L; 7L]; [64L; 4L; 6L]; [125L; 1L; 2L; 5L];
    [216L; 1L; 2L; 6L]; [343L; 3L; 3L; 4L]; [512L; 1L; 2L; 5L];
    [729L; 2L; 7L; 9L]]

我想过滤具有相同尾部元素的列表。

例如,如果我有2个列表,如下面列出的列表

    [[23L;1L;2L;3L];[33L;1L;2L;3L]]

我想从列表的主列表中过滤掉它们,但我是F#的新手,我遇到了问题。如果有人可以帮助我,那将是非常好的。更具体一点,我想过滤4个具有完全相同尾部的列表。

我提供的列表只是用于显示格式的示例。

谢谢

更新:我也可以让它有一个元组。例如

 (int64 * int64 list) list)

 [(1L, [1L]); (8L, [8L]); (27L, [2L; 7L]); (64L, [4L; 6L]);
 (125L, [1L; 2L; 5L]); (216L, [1L; 2L; 6L]); (343L, [3L; 3L; 4L]);
 (512L, [1L; 2L; 5L]); (729L, [2L; 7L; 9L]); (1000L, [0L; 0L; 0L; 1L])]

但我仍面临同样的问题。我需要过滤具有相同列表元素的元素。

1 个答案:

答案 0 :(得分:0)

很多选择 - 这是"免费的"并一直管理数据。可以使用snd替换groupBy List.tail以获取原始问题的答案,而不是更新。

let data = [(1L, [1L]); (8L, [8L]); (27L, [2L; 7L]); (64L, [4L; 6L]);
            (125L, [1L; 2L; 5L]); (216L, [1L; 2L; 6L]); (343L, [3L; 3L; 4L]);
            (512L, [1L; 2L; 5L]); (729L, [2L; 7L; 9L]); (1000L, [0L; 0L; 0L; 1L])]
data |> Seq.groupBy snd |> Seq.map (snd >> List.ofSeq)
     |> Seq.filter (List.length >> ((<) 1)) |> Seq.concat |> List.ofSeq

val it : (int64 * int64 list) list =
  [(125L, [1L; 2L; 5L]); (512L, [1L; 2L; 5L])]

最奇怪的部分是((<) 1) - 相当于fun x -> 1 < x。 如果您愿意,可以扩展>>函数联接 - 例如取代

带有|> Seq.map (snd >> List.ofSeq)

|> Seq.map snd |> Seq.map List.ofSeq