Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming 如何在elixir中获得列表中的副本?_Functional Programming_Elixir_Reduce - Fatal编程技术网

Functional programming 如何在elixir中获得列表中的副本?

Functional programming 如何在elixir中获得列表中的副本?,functional-programming,elixir,reduce,Functional Programming,Elixir,Reduce,如果您希望在列表中获取重复的值而不是uniq值,那么在使用模式匹配的快速、密集的脚本中如何实现这一点 例如,输入[“ash”、“bob”、“cat”、“bob”、“ash”]如果要获取所有重复项的唯一列表,如何获取[“ash”、“bob”]? def get_uniq_duplicates(all) do all |> Enum.reduce({[], []}, fn val, {once, duplicates} -> if once |> Enum

如果您希望在列表中获取重复的值而不是uniq值,那么在使用模式匹配的快速、密集的脚本中如何实现这一点


例如,输入
[“ash”、“bob”、“cat”、“bob”、“ash”]
如果要获取所有重复项的唯一列表,如何获取
[“ash”、“bob”]

  def get_uniq_duplicates(all) do
    all |> Enum.reduce({[], []}, fn val, {once, duplicates} -> 
      if once |> Enum.member?(val) do 
        if duplicates |> Enum.member?(val) do
          {once, duplicates}
        else
          {once, duplicates ++ [val]}
        end 
      else
        {once ++ [val], duplicates}
      end
    end) |> elem(1)
  end
如果您想要一个副本列表,其中每个值只有一个副本被删除,例如
[“a”、“b”、“c”、“c”、“c”]->[“c”、“c”]

然后,您可以使用更简单的:

  def get_duplicates(all) do
    all |> Enum.reduce({[], []}, fn val, {once, duplicates} -> 
      if once |> Enum.member?(val) do 
        {once, duplicates ++ [val]}
      else
        {once ++ [val], duplicates}
      end
    end) |> elem(1)
  end

<>你既然指定了一个快速、密集的脚本,我想你应该考虑这个解决方案:

l = ["ash", "bob", "cat", "bob", "ash", "ash"]

# to get all duplicates
l -- Enum.uniq(l) # => ["bob", "ash", "ash"]

# to get a unique list of duplicates
Enum.uniq(l -- Enum.uniq(l)) # => ["bob", "ash"]

我会这样做:

["ash", "bob", "cat", "bob", "ash"]
|> (&((&1 -- (&1 |> Enum.uniq())) |> Enum.uniq())).()
这与执行以下操作相同:

my_list = ["ash", "bob", "cat", "bob", "ash"]
(my_list -- (my_list |> Enum.uniq())) |> Enum.uniq()
正在发生的事情:

  • 获取所有唯一值的列表(我们想要的补充):
    my_list>Enum.uniq()
  • 使用列表减法获得这些唯一值的补码
  • 使用另一个调用
    Enum.uniq
    在唯一列表中获取这些“重复项”

  • 这和我自己的答案非常相似,在发帖时只差30秒。幽灵般的