如何在长生不老药的列表中获得重复项?

问题描述

如果要获取列表中的重复值而不是uniq值,如何在使用模式匹配的快速密集脚本中做到这一点?

例如,输入["ash","bob","cat","ash"],我怎么能得到["ash","bob"]

解决方法

由于您指定了快速,密集的脚本,因此我认为您应该考虑以下解决方案:

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

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

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

这是我要怎么做:

["ash","ash"]
|> (&((&1 -- (&1 |> Enum.uniq())) |> Enum.uniq())).()

这与这样做相同:

my_list = ["ash","ash"]
(my_list -- (my_list |> Enum.uniq())) |> Enum.uniq()

发生了什么事

  1. 获取所有唯一值的列表(对我们想要的值的补充):my_list |> Enum.uniq()
  2. 使用列表减法获取这些唯一值的补码。
  3. 再次调用Enum.uniq,将这些“重复项”保存到唯一列表中。
,

如果您想获得所有重复项的唯一列表

  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"]

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

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