Functional programming 如何在elixir中获得列表中的副本?
如果您希望在列表中获取重复的值而不是uniq值,那么在使用模式匹配的快速、密集的脚本中如何实现这一点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
例如,输入
[“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秒。幽灵般的