首页 > 解决方案 > Elixir:在元组列表中找到最常见的元素(频率)?

问题描述

我知道这是 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。

是否有一个函数可以做到这一点,或者我必须创建自己的函数来“迭代”每个元组的列表elem(list, index)

标签: listtupleselixirelementfrequency

解决方案


您可以组合Enum.frequencies_by/2Enum.max_by/2获得最常见的元素:

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_by返回一个映射(并且映射是无序的),因此max_by如果存在平局,则未定义哪个元素会返回,如您在最后一个示例中所见。


推荐阅读