List Elixir:在元组列表中找到最常见的元素(频率)?
我知道这是关于stackoverflow的常见问题,但无法找到专门针对Elixir的解决方案 考虑元组列表:List Elixir:在元组列表中找到最常见的元素(频率)?,list,tuples,elixir,element,frequency,List,Tuples,Elixir,Element,Frequency,我知道这是关于stackoverflow的常见问题,但无法找到专门针对Elixir的解决方案 考虑元组列表: [ {1, 3, "1S"}, {10, 3, "3S"}, {10, 3, "9S"}, {10, 3, "10S"}, {10, 3, "11S"}, {12, 3, "12S"}, {13, 3, "13S"} ]
[
{1, 3, "1S"},
{10, 3, "3S"},
{10, 3, "9S"},
{10, 3, "10S"},
{10, 3, "11S"},
{12, 3, "12S"},
{13, 3, "13S"}
]
预期成果:
每个元组的第一个参数中最常见的元素是10。
每个元组的第二个参数中最常见的元素是3
是否有一个函数可以做到这一点,或者我必须创建自己的函数来迭代每个elemlist、index的元组列表?但这并不是那么简单。稍微靠近下面的行就行了 输入=[ {1,3,1S}, {10,3,3S}, {10,3,9S}, {10,3,10S}, {10,3,11S}, {12,3,12S}, {13,3,13S} ] 输入 准备转置矩阵 |>Enum.map和Tuple.to_list/1 转置 |>fn mx->List.zipmx |>Enum.map和Tuple.to_List/1 end。 按值分组,以获得长度 |>枚举映射和枚举分组依据&1,fn e->e结束 获取最大值 |>Enum.map和Enum.max_by&1,fn{uu,v}->lengthv end 收集 |>Enum.mapfn{k,v}->{k,lengthv}end ⇒[{10,4},{3,7},{10S,1}] 您可以组合和以获得最频繁的元素:
iex(2)> x |> Enum.frequencies_by(&elem(&1, 0)) |> Enum.max_by(&elem(&1, 1))
{10, 4}
iex(3)> x |> Enum.frequencies_by(&elem(&1, 1)) |> Enum.max_by(&elem(&1, 1))
{3, 7}
iex(4)> x |> Enum.frequencies_by(&elem(&1, 2)) |> Enum.max_by(&elem(&1, 1))
{"10S", 1}
请注意,由于frequencies\u by返回一个map,而map是无序的,因此如果有一个tie,max\u by返回哪个元素是未定义的,正如您在上一个示例中所看到的。其他两个答案都是好的。如果您想在不事先知道元组大小的情况下获得所有频率的概览,这只是一种替代方法,这是不应该发生的:
input = [
{1, 3, "1S"},
{10, 3, "3S"},
{10, 3, "9S"},
{10, 3, "10S"},
{10, 3, "11S"},
{12, 3, "12S"},
{13, 3, "13S"}
]
input
|> Enum.map(&Tuple.to_list/1)
|> Enum.reduce(
%{},
fn listy, final_map ->
listy
|> Enum.with_index()
|> Enum.reduce(final_map, fn {element, index}, acc ->
acc
|> Map.update(index, %{element => 1}, fn existing_value ->
existing_value |> Map.update(element, 1, fn existing_element -> existing_element + 1 end)
end)
end)
end
)
|> IO.inspect(label: "map with 'tuple element index' as keys and 'map of element frequencies' as values")
Legossia的答案告诉您如何计算单个索引的最常见值,但它没有显示如何计算元组中所有元素的最常见值 这是一个版本,使用它来计算每个元组索引中最常见的元素——它适用于任何长度的元组,假设列表中的所有元组长度相同 定义最常见元素[],do:%{} def most_common_elems[第一个|)=列表do max_i=元组大小first-1 Map.new0..max\u i和most\u common\u atlist和1 终止 我知道最普通的地图 最大值= 列表 |>枚举频率由&elem&1,i |>枚举最大值由&elem&1,1 |>元素0 {i,max_val} 终止 示例输出: %{0=>10,1=>3,2=>10S}
这显示了如何计算单个元素,但不是所有元素。我添加了一个答案,将其应用于所有元组元素。