繁体   English   中英

如何处理元组列表?

[英]How do I operate on a list of lists of tuples?

我有这样的东西:

[[('A',2), ('C',0), ('G',0), ('T',0)]
,[('A',0), ('C',2), ('G',0), ('T',0)]
,[('A',0), ('C',0), ('G',2), ('T',0)]
,[('A',0), ('C',0), ('G',0), ('T',2)]]

我想对每个元组的第二个元素进行操作。 我想将它们除以一定的数字,以使其成为两倍。

我已经尝试过使用地图,所以我可以只打印元组的第二个元素

map (map snd) f

其中f是上面的列表。 我得到以下内容:

[[2,0,0,0],[0,2,0,0],[0,0,2,0],[0,0,0,2]]

我现在真的很困; 我似乎无法弄清楚下一步该怎么做,以及如何对它们进行操作。

您只需要使用两个映射,一个映射用于遍历外部列表,另一个映射用于遍历内部列表。 ghci中进行一些演示,以使其清楚:

λ> let x = [[('A',2),('C',0),('G',0),('T',0)],[('A',0),('C',2),('G',0),('T',0)]]
λ> map (map id) x
[[('A',2),('C',0),('G',0),('T',0)],[('A',0),('C',2),('G',0),('T',0)]]
λ> map (\y -> map id y) x
[[('A',2),('C',0),('G',0),('T',0)],[('A',0),('C',2),('G',0),('T',0)]]
λ> map (\y -> map (\(a,b) -> (a,b)) y) x
[[('A',2),('C',0),('G',0),('T',0)],[('A',0),('C',2),('G',0),('T',0)]]
λ> map (\y -> map (\(a,b) -> (a,b * 8)) y) x
[[('A',16),('C',0),('G',0),('T',0)],[('A',0),('C',16),('G',0),('T',0)]]

请注意,上面编写的前三个示例是等效的。 请注意,我是如何扩展它们中的每一个的。 id是一个身份函数,将返回与输入相同的输出。 在最后一个map表达式中,我将* 8应用于元组的第二个值。 同样,您可以实现自定义操作。

Control.Arrow模块公开了您可以使用的second功能:

λ: let xs = [[('A',2), ('C',0), ('G',0), ('T',0)]]
λ: map (map (second (/ 3))) xs
[[('A',0.6666666666666666),('C',0.0),('G',0.0),('T',0.0)]]

使用镜头

λ: import Control.Lens
λ: import Control.Lens.Traversal
λ: let input = [[('A',2)],[('G',0),('T',1)]]
λ: over (mapped.mapped._2) ((/ 4).fromIntegral) input
[[('A',0.5)],[('G',0.0),('T',0.25)]]

如果要获取包含元组中所有第二个元素的列表,可以使用concat展平列表,然后map snd到该新列表上。 这将为您提供一个由元组的所有第二个元素组成的列表。

secondElements = map snd . concat

这将为您提供元组中所有第二个元素的列表,然后您可以在其上映射功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM