Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Elixir:在元组列表中找到最常见的元素(频率)?_List_Tuples_Elixir_Element_Frequency - Fatal编程技术网

List 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"} ]

我知道这是关于stackoverflow的常见问题,但无法找到专门针对Elixir的解决方案

考虑元组列表:

[
  {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}
这显示了如何计算单个元素,但不是所有元素。我添加了一个答案,将其应用于所有元组元素。