list - 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)
?
解决方案
您可以组合Enum.frequencies_by/2
并Enum.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
如果存在平局,则未定义哪个元素会返回,如您在最后一个示例中所见。
推荐阅读
- javafx - 从 JavaFX 对话框中的数字文本字段中转义
- django - 列出 django 项目的应用程序
- node.js - 在“纱线启动”命令期间出现错误
- c# - 斑马打印机:System.Runtime.InteropServices.COMException (0x8004FFFF)
- android - java.lang.ClassCastException: androidx.appcompat.widget.ActionBarOverlayLayout 不能转换为 android.support.v7.widget.DecorContentParent
- ios - ios APP被杀死firebase时无法在注册期间删除用户
- jpa - Open JPA Query 在 DB2 中第二次执行失败(因为 byte[] 参数)
- h.264 - H.264 RTP 带内参数集变化
- c++ - 使用 reinterpret_cast (C++) 从存储在 char 数组中的二进制文件中读取值
- sql - SQL子查询选择具有相同的分组依据