【问题标题】:How do you get duplicates in a list in elixir?如何在 elixir 的列表中获取重复项?
【发布时间】:2021-01-21 00:06:46
【问题描述】:

如果您想在列表中获取重复值而不是 uniq 值,您将如何在使用模式匹配的快速、密集脚本中执行此操作?

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

【问题讨论】:

    标签: functional-programming elixir reduce


    【解决方案1】:

    我会这样做:

    ["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()
    

    发生了什么:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这和我自己的回答很相似,发帖时间相差只有30秒。诡异...
      【解决方案3】:

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

        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
      

      【讨论】:

        猜你喜欢
        • 2015-07-21
        • 1970-01-01
        • 2012-06-05
        • 1970-01-01
        • 2015-06-25
        • 2020-01-20
        • 2013-09-25
        • 2018-10-27
        • 2016-04-21
        相关资源
        最近更新 更多