我的列表如下所示。
[[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])]
但我仍面临同样的问题。我需要过滤具有相同列表元素的元素。
答案 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