说我有一个看起来像这样的关键字列表:
[a: 1, b: 2, c: 3...]
我想返回如下所示的关键字列表:
[a: f(1), b: 2, c: 3...]
f/1
是我应用于元素:a
的函数。
列表的长度或顺序不确定。
最好的方法是什么?
谢谢!
答案 0 :(得分:1)
要应用于第一个元素:
iex(1)> [{key, value} | tail] = [a: 1, b: 2, c: 3]
[a: 1, b: 2, c: 3]
iex(2)> fun = fn(num) -> num + 1 end
#Function<6.128620087/1 in :erl_eval.expr/5>
iex(3)> [{key, fun.(value)} | tail]
[a: 2, b: 2, c: 3]
如果顺序和长度不确定,我建议您先翻译成地图。
如果列表较小,则可以逐个循环元素并在:a
上匹配以运行函数。
答案 1 :(得分:1)
您可以使用Keyword.update!/3
或Keyword.update/4
:
list = [a: 1, b: 2, c: 3]
Keyword.update! list, :a, &(&1+1)
答案 2 :(得分:1)
您也可以使用Kernel.update_in/3(除了Keyword.update!解决方案之外)
list = [a: 1, b: 2, c: 3]
Kernel.update_in list, [:a], fn(value) -> value end
fn
部分由您决定如何转换值。
编辑
如果关键字列表中有多个:a
键,那么您可以将Enum.map/2用作:
list = [a: 1, b: 2, c: 3, a: 4]
Enum.map list, fn {:a, v} -> {:a, v+1}; {k,v} -> {k,v} end