如何过滤地图中的相似值?

how to filter similar values in a map?

我有一个简单的地图,我想过滤具有相似值的地图

输入

%{a: 1, b: 1, c: 2}

搜索值为1

输出

%{a: 1, b: 1}
%{a: 1, b: 1, c: 2} |> Map.filter(fn {_key, val} -> val == 1 end)

https://hexdocs.pm/elixir/Map.html#filter/2

对于 Elixir 1.13 及以上版本,您可以使用 Map.filter/2 combined with match?/2:

Map.filter(map, &match?({_k, 1}, &1))

对于早期版本,如果你需要做多个过滤器(根据note in the docs), you can combine Enum.filter/2 and Map.new/1:

map |> Enum.filter(&match?({_k, 1}, &1)) |> Map.new()

在这两种情况下,结果都是:

%{a: 1, b: 1}

找到最常见的值:

map
|> Enum.group_by(fn {_key, value} -> value end)
|> Enum.max_by(fn {_value, group} -> length(group) end)
|> elem(0)

示例的输出:

1

为了多样性,这里是for理解的解决方案。

for {k, v} <- %{a: 1, b: 1, c: 2},
    v != 1,
    into: %{},
    do: {k, v}

#⇒ %{c: 2}