Si vous souhaitez obtenir des doublons au lieu de valeurs uniques dans une liste, comment feriez-vous cela dans un script rapide et dense qui utilise la correspondance de modèles?

Par exemple, avec une entrée de ["ash", "bob", "cat", "bob", "ash"] comment pourrais-je obtenir ["ash", "bob"]?

3
Laser 6 oct. 2020 à 09:10

3 réponses

Meilleure réponse

Puisque vous avez spécifié que vous vouliez un script rapide et dense, je pense que vous devriez envisager cette solution:

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"]
6
Paweł Obrok 6 oct. 2020 à 09:11

Voici comment je le ferais:

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

Cela revient à faire:

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

Qu'est-ce qui se passe:

  1. obtenir une liste de toutes les valeurs uniques (le complément de ce que nous voulons): my_list |> Enum.uniq()
  2. Utilisez la soustraction de liste pour obtenir le complément de ces valeurs uniques.
  3. Utilisez un autre appel à Enum.uniq pour obtenir ces "doublons" dans une liste unique.
1
Peaceful James 6 oct. 2020 à 09:11

Si vous souhaitez obtenir une liste unique de tous les doublons

  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

Si vous voulez une liste de doublons où une seule copie de chaque valeur a été supprimée, par exemple. ["a", "b", "c", "c", "c"] -> ["c", "c"]

Ensuite, vous pouvez utiliser le plus simple:

  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
0
Laser 6 oct. 2020 à 06:10