【问题标题】:F# Create list of tuples from flat list by taking n and n-1F# 通过取 n 和 n-1 从平面列表中创建元组列表
【发布时间】:2014-07-30 19:40:44
【问题描述】:

所以基本上我有一个列表 [1,2,3,4,...,n] 我想创建一个新列表(元组),然后使用 List.Map 将函数应用于新列表. 新列表的格式为 [(NULL,1),(2,1),(3,2),(4,3),...,(n,n-1)]

但我并没有直接看到解决这个问题的最佳方法是什么。 有什么想法吗?

谢谢

编辑: 有了下面的答案,我最终像这样解决了我的问题

let TotalDistance (points:ResizeArray<TrackPoint>) = List.ofSeq(points) |> Seq.pairwise |> Seq.map(fun (x,y) -> DistanceBetween x.Position y.Position) |> Seq.sum

Trackpoint 是坐标 (C#) 的集合,DistanceBetween 是半正弦公式。

感谢您的帮助!

【问题讨论】:

  • 这看起来很简单,或者我误解了这个问题:[1..10] |> List.map (fun n -> (n+1,n) ) 对于第一项,我是不确定,f# 中没有空值
  • 是的,这也有效(doh ;))...但是你得到一个 n+1 太多了 - 我想你可以尝试使用 n-1 代替 ;)
  • @elios264 这仅适用于您的输入列表是序号的情况,但不能解决一般情况。

标签: list f# functional-programming tuples


【解决方案1】:

这基本上就是Seq.pairwise 所做的。

[1..4] |> Seq.pairwise
> val it : seq<int * int> = seq [(1, 2); (2, 3); (3, 4)]

您可以通过map 传递它,并在必要时交换元组项。 windowed 有点矫枉过正,因为它为列表的每个元素创建一个数组。

如果您确实需要第一个元素出现两次,您可以将 None 加入列表。

let pairs xs = 
    None::xs 
    |> Seq.pairwise
    |> Seq.toList

pairs (List.map Some [1..4])

【讨论】:

  • 非常正确 - 忘了pairwise ;)
【解决方案2】:

看看Seq.windowed,它几乎可以满足您的需求:

[1..10] 
|> Seq.windowed 2 
|> List.ofSeq;;

val it : int [] list =
  [[|1; 2|]; [|2; 3|]; [|3; 4|]; [|4; 5|]; [|5; 6|]; [|6; 7|]; [|7; 8|];
   [|8; 9|]; [|9; 10|]]

我会忽略你的NULL(我们真的不想要这个;))然后玩一下,这样你就可以得到:

[1..10] 
|> Seq.windowed 2 
|> Seq.map (fun [|a;b|] -> (b,a)) 
|> List.ofSeq;;

val it : (int * int) list =
  [(2, 1); (3, 2); (4, 3); (5, 4); (6, 5); (7, 6); (8, 7); (9, 8); (10, 9)]

所以你要搜索的是:

let pairList ls = 
   ls
   |> Seq.windowed 2 
   |> Seq.map (fun [|a;b|] -> (b,a)) 
   |> List.ofSeq

将其视为获得NULL 的练习;) (好吧,这很卑鄙 - 你的 (Null,1) 不适合这个序列

【讨论】:

  • 我喜欢它,但我会选择 seq.pairwise。
猜你喜欢
  • 1970-01-01
  • 2014-02-06
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 2021-07-04
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
相关资源
最近更新 更多