如何从非原子键的元组列表提取所有键?是否有简化方法?
问题描述
我需要从元组列表中提取所有键,但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
相关产品推荐
相关产品推荐

