提取管道中元组的第二个元素

Posted

技术标签:

【中文标题】提取管道中元组的第二个元素【英文标题】:Extract the second element of a tuple in a pipeline 【发布时间】:2018-11-02 22:33:21 【问题描述】:

我希望能够提取管道中元组的第 N 项,而不使用 with 或以其他方式破坏管道。 Enum.at 可以完美运行,除了元组不是枚举。

这是一个鼓舞人心的例子:

colors = %red: 1, green: 2, blue: 3
data = [:red, :red, :blue]
data 
|> Enum.map(&Map.fetch(colors, &1))
|> Enum.unzip

这会返回[:ok, :ok, :ok], [1, 1, 3],假设我只想提取[1, 1, 3]

(对于这种特定情况,我可以使用fetch!,但我的实际代码不存在。)

我可以补充

|> Tuple.to_list
|> Enum.at(1)

有没有更好的方法不需要从每个元组中创建一个临时列表?

【问题讨论】:

【参考方案1】:

使用Kernel.elem/2:

iex(1)> [:ok, :ok, :ok], [1, 1, 3] |> elem(1)
[1, 1, 3]

【讨论】:

啊,我像往常一样想太多了。谢谢【参考方案2】:

模式匹配可以提供帮助

 _status, required_value  = 
  data 
    |> Enum.map(&Map.fetch(colors, &1))
    |> Enum.unzip

你可以忽略_status

【讨论】:

我应该澄清一下,extract 步骤位于管道的中间。使用模式匹配(也是我的首选方式),最终需要中间变量和多个管道:(

以上是关于提取管道中元组的第二个元素的主要内容,如果未能解决你的问题,请参考以下文章

如何提取每个子列表中每个元组的第一个元素?

如何访问列表中元组的第一个元素?

如何使 cat 和 grep 在 c 中的第一个和第二个管道中工作,就像 bash 中的 heredoc <<

将 char 添加到列表中的每个元组的第二个元素

如何使用 Azure REST API 从管道中获取所有变量?

python中的list元组如何按照第二维元素排序