如何在嵌套Enum调用中使用管道传递的列表作为Enum.count的参数
实现方案
方案1:使用then/2捕获管道中间值
管道输出的结果可以通过then/2绑定到变量,就能在内部的嵌套函数中直接调用:
def word_count(str) do String.downcase(str) |> String.split() |> then(fn word_list -> Enum.map(word_list, fn x -> Enum.count(word_list, &(&1 == x)) end) end) end
注意:
Enum.count/2的第二个参数为谓词函数,需要调整为匹配目标词的逻辑,不能直接传入待匹配的字符串。
方案2:提前赋值中间变量
也可以先把管道处理后的列表赋值给变量,再执行后续逻辑,可读性更高:
def word_count(str) do word_list = str |> String.downcase() |> String.split() Enum.map(word_list, fn x -> Enum.count(word_list, &(&1 == x)) end) end
优化建议
如果你的需求是统计每个单词的出现频次,当前嵌套遍历的写法时间复杂度为O(n²),列表较长时性能较差,可以直接用Elixir内置的Enum.frequencies/1实现,时间复杂度为O(n):
def word_count(str) do str |> String.downcase() |> String.split() |> Enum.frequencies() end
返回结果为%{"单词1" => 计数1, "单词2" => 计数2}格式的映射,你可以根据需要再转换为列表格式。
内容的提问来源于stack exchange,提问作者Samuel Pereira
相关产品推荐
相关产品推荐

