如何过滤地图中的相似值?
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)
对于 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}