带有元组修改的 Elixir 列表
Elixir lists with tuples modifications
我正在尝试创建以下列表:
["extract-audio", "audio-format", "mp3"]
基于:
options = ["extract-audio", "audio-format": "mp3"]
我的代码从提供的 options
移动到首选列表:
arguments = Enum.map(options, fn(option) ->
parametrize(option)
end) |> List.flatten
def parametrize(arg) when is_tuple(arg), do: Tuple.to_list(arg)
def parametrize(arg) when is_binary(arg), do: arg
返回的列表基本正确:
["extract-audio", :"audio-format", "mp3"]
但是,我不太明白audio-format
前面的分号是干什么用的。创建某种正则表达式来替换它感觉有点不对劲。是否有比我目前的实施更好的解决方案?我也考虑过地图,但在某些情况下,我只想要一个参数而不是一个键值。
我不确定这是否有效,但这确实有效
替换
def parametrize(arg) when is_tuple(arg), do: Tuple.to_list(arg)
和
def parametrize(arg) when is_tuple(arg) do
for el <- Tuple.to_list(arg) do
if is_atom(el), do: Atom.to_string(el), else: el
end
end
你不需要任何帮助,只需使用带有多个子句的化简器。下面的代码需要通过列表一次,不需要展平。
options = ["extract-audio", "audio-format": "mp3"]
options
|> Enum.reduce([], fn
{k, v}, acc -> [v, k | acc]
e, acc -> [e | acc]
end)
|> Enum.reverse()
#⇒ ["extract-audio", :"audio-format", "mp3"]
您可能会注意到,:"audio-format"
是一个原子。那是因为 Elixir 用符号 "foo": "bar
.
做了一些神奇的建筑 Keyword
["a-b": 42] == [{:"a-b", 42}]
#⇒ true
有多种方法可以实现这个
1.递归
def parameterize(list, acc \ [])
def parameterize([{k, v} | tail], acc) do
parameterize(tail, [v, k | acc])
end
def parameterize([element | tail], acc) do
parameterize(tail, [element | acc])
end
def parameterize([], acc), do: acc |> List.flatten |> Enum.reverse()
2。使用 Enum.reduce 上面 Aleksei Matiushkin 的回答
options = ["extract-audio", "audio-format": "mp3"]
options
|> Enum.reduce([], fn
{k, v}, acc -> [v, k | acc]
e, acc -> [e | acc]
end)
|> Enum.reverse()
#⇒ ["extract-audio", :"audio-format", "mp3"]
3。使用 Enum.flat_map
Enum.flat_map(options, fn
value when is_tuple(value) -> Tuple.to_list(value)
any -> [any]
end)
根据舒适度,可以使用三个中的任何一个:D
我正在尝试创建以下列表:
["extract-audio", "audio-format", "mp3"]
基于:
options = ["extract-audio", "audio-format": "mp3"]
我的代码从提供的 options
移动到首选列表:
arguments = Enum.map(options, fn(option) ->
parametrize(option)
end) |> List.flatten
def parametrize(arg) when is_tuple(arg), do: Tuple.to_list(arg)
def parametrize(arg) when is_binary(arg), do: arg
返回的列表基本正确:
["extract-audio", :"audio-format", "mp3"]
但是,我不太明白audio-format
前面的分号是干什么用的。创建某种正则表达式来替换它感觉有点不对劲。是否有比我目前的实施更好的解决方案?我也考虑过地图,但在某些情况下,我只想要一个参数而不是一个键值。
我不确定这是否有效,但这确实有效
替换
def parametrize(arg) when is_tuple(arg), do: Tuple.to_list(arg)
和
def parametrize(arg) when is_tuple(arg) do
for el <- Tuple.to_list(arg) do
if is_atom(el), do: Atom.to_string(el), else: el
end
end
你不需要任何帮助,只需使用带有多个子句的化简器。下面的代码需要通过列表一次,不需要展平。
options = ["extract-audio", "audio-format": "mp3"]
options
|> Enum.reduce([], fn
{k, v}, acc -> [v, k | acc]
e, acc -> [e | acc]
end)
|> Enum.reverse()
#⇒ ["extract-audio", :"audio-format", "mp3"]
您可能会注意到,:"audio-format"
是一个原子。那是因为 Elixir 用符号 "foo": "bar
.
Keyword
["a-b": 42] == [{:"a-b", 42}]
#⇒ true
有多种方法可以实现这个
1.递归
def parameterize(list, acc \ [])
def parameterize([{k, v} | tail], acc) do
parameterize(tail, [v, k | acc])
end
def parameterize([element | tail], acc) do
parameterize(tail, [element | acc])
end
def parameterize([], acc), do: acc |> List.flatten |> Enum.reverse()
2。使用 Enum.reduce 上面 Aleksei Matiushkin 的回答
options = ["extract-audio", "audio-format": "mp3"]
options
|> Enum.reduce([], fn
{k, v}, acc -> [v, k | acc]
e, acc -> [e | acc]
end)
|> Enum.reverse()
#⇒ ["extract-audio", :"audio-format", "mp3"]
3。使用 Enum.flat_map
Enum.flat_map(options, fn
value when is_tuple(value) -> Tuple.to_list(value)
any -> [any]
end)
根据舒适度,可以使用三个中的任何一个:D