你如何在长生不老药的列表中获得重复项?
How do you get duplicates in a list in elixir?
如果您想在列表中获取重复项而不是唯一值,您将如何在使用模式匹配的快速、密集的脚本中执行此操作?
例如,输入 ["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
以在唯一列表中获取这些“重复项”。
["ash", "bob", "cat", "bob", "ash"]
|> Enum.group_by(&(&1))
|> Enum.filter(&((&1 |> Enum.count()) > 1))
|> Enum.map(&(&1 |> Enum.uniq()))
|> List.flatten()
此方法支持搜索特定条件的结构。
如果您想在列表中获取重复项而不是唯一值,您将如何在使用模式匹配的快速、密集的脚本中执行此操作?
例如,输入 ["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
以在唯一列表中获取这些“重复项”。
["ash", "bob", "cat", "bob", "ash"]
|> Enum.group_by(&(&1))
|> Enum.filter(&((&1 |> Enum.count()) > 1))
|> Enum.map(&(&1 |> Enum.uniq()))
|> List.flatten()
此方法支持搜索特定条件的结构。