【问题标题】:How to declare a piped list in a Enum inside another Enum?如何在另一个枚举中的枚举中声明管道列表?
【发布时间】:2023-04-11 00:40:02
【问题描述】:

我正在尝试在另一个 Enum 内的 Enum 中使用管道列表。为了让自己更清楚一点,下面是我的代码:

  def word_count(str) do
    String.downcase(str)
    |> String.split
    |> Enum.map(fn x -> Enum.count(LIST HERE, x) end)
  end

所以我想做的是使用管道列表作为 Enum.count 中的参数

【问题讨论】:

    标签: list enums arguments pipe elixir


    【解决方案1】:

    Enum 函数将可枚举作为第一个参数,因此您可以简单地将列表通过管道传递给它们。

    如果要统计每个单词出现的次数,可以使用Enum.frequencies/1

    def word_count(str) do
      str
      |> String.downcase()
      |> String.split()
      |> Enum.frequencies()
    end
    

    例子:

    iex> Example.word_count("foo bar baz")                            
    %{"bar" => 1, "baz" => 1, "foo" => 1}
    

    在这种情况下Enum.frequencies/1 很有帮助,但您通常可以使用Enum.reduce/3 来编写自己的逻辑。这是 Enum.frequencies/1 替换为 Enum.reduce/3 做同样的事情:

    def word_count(str) do
      str
      |> String.downcase()
      |> String.split()
      |> Enum.reduce(%{}, fn word, acc ->
        Map.update(acc, word, 1, fn count -> count + 1 end)
      end)
    end
    

    作为对 cme​​ts 的回应,使用 Kernel.then/1,并声明可能有更好的方法来执行此操作,具体取决于所需的内容(如上面的 reduce,或使用理解):

    1..10
    |> then(fn one_to_ten ->
      Enum.map(one_to_ten, fn x ->
        Enum.map(one_to_ten, fn y ->
          {x, y}
        end)
      end)
    end)
    

    【讨论】:

    • 感谢您的评论亚当。我发布的代码不完整。我想要做的是传递一个字符串作为参数,将其拆分,然后计算每个单词出现在列表中的次数。但是我陷入了如何在另一个枚举中的枚举中使用管道列表
    • 啊,你可以使用Enum.frequencies/1。更新了答案(我也会在枚举部分回答枚举,等一下……)
    • 再次感谢您的回答。你所有的提示都非常有帮助。关于在另一个 Enum 中的 Enum 中使用管道列表,你知道这是否可能吗?
    • 还是不太明白你的意思。是的,这是可能的,但我经常认为reduce 或其他东西会更好。试试[[1,2],[3,4]] |> Enum.each(fn x -> Enum.each(x, &IO.puts/1) end)
    • 在我发布的代码的第 4 行中,有一个 Enum.map 接收列表作为第一个参数。在这个 Enum.map 的函数中,我想使用另一个 Enum 接收两个参数,而第一个参数我想使用 Enum.map 接收到的相同列表
    【解决方案2】:

    如果你足够现代,(你应该是)then/2 是你的朋友。

    "Foo bar foo"
    |> String.downcase()
    |> String.split()
    |> then(&Enum.map(&1, fn x -> Enum.count(&1, fn y -> y == x end) end))
    #⇒ [2, 1, 2]
    

    最易读的解决方案仍然是

    words =
      "Foo bar foo"
      |> String.downcase()
      |> String.split()
    
    Enum.map(words, &Enum.count(words, fn x -> x == &1 end))
    

    尽管可读性强,但不应尝试保留单个管道。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      • 2014-08-22
      • 1970-01-01
      相关资源
      最近更新 更多