You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从非原子键的元组列表提取所有键?是否有简化方法?

问题描述

我需要从元组列表中提取所有键,但Keyword模块要求键必须为atom类型,否则会抛出错误。目前我通过Enum.map/2实现循环提取,想了解是否已有更简便的替代方案。示例代码如下:

iex(4)> a = [{{1,0,0},1},{{1,0,1},2}]
[{{1, 0, 0}, 1}, {{1, 0, 1}, 2}]
iex(5)> Enum.map(a,fn {key,_} -> key end)
解决方案

首先明确:Keyword模块的函数(比如Keyword.keys/1)确实只适用于键为atom的关键字列表,你的场景里键是元组,所以没法直接用这类函数。

更简便的替代方案可以用Enum.unzip/1:这个函数会把元组列表拆分成两个列表,第一个列表就是所有元组的第一个元素(也就是你要的键),第二个是所有元组的第二个元素。只需要取拆分后的第一个列表即可:

iex> a = [{{1,0,0},1},{{1,0,1},2}]
iex> Enum.unzip(a) |> elem(0)
[{{1, 0, 0}, {1, 0, 1}}]

对比你原来的Enum.map写法,Enum.unzip/1更简洁直观,不需要手动写匿名函数来解构元组。

另外,如果你只是偶尔需要提取键,也可以用for推导式,写法同样简洁:

iex> for {key, _} <- a, do: key
[{{1, 0, 0}, {1, 0, 1}}]

这两种方案都比手动写Enum.map的匿名函数更简洁,其中Enum.unzip/1在同时需要键和值的场景下更实用,而for推导式在逻辑更复杂的场景下扩展性更好。

内容的提问来源于stack exchange,提问作者Chen Yu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 14:06:15