【问题标题】:Elixir: Split list into odd and even elements as two items in tupleElixir:将列表拆分为奇数和偶数元素作为元组中的两项
【发布时间】:2017-01-26 15:37:00
【问题描述】:

我对 Elixir 编程很陌生,并且在拆分成两个元素元组方面非常困难。

给定一个整数列表,返回一个包含两个元素的元组。第一个元素是列表中偶数的列表。第二个是奇数列表。

Input : [ 1, 2, 3, 4, 5 ]
Output  { [ 2, 4],  [ 1, 3, 5 ] }

我已经确定了奇数或偶数,但不知道如何进行。

defmodule OddOrEven do
import Integer

  def task(list) do

Enum.reduce(list, [],  fn(x, acc) -> 
         case Integer.is_odd(x) do
            :true -> # how do I get this odd value listed as a tuple element
            :false -> # how do I get this even value listed as a tuple element
         end
        #IO.puts(x)
         end
    )     
end

【问题讨论】:

    标签: erlang elixir


    【解决方案1】:

    你可以使用Enum.partition/2:

    iex(1)> require Integer
    iex(2)> [1, 2, 3, 4, 5] |> Enum.partition(&Integer.is_even/1)
    {[2, 4], [1, 3, 5]}
    

    如果你真的想使用Enum.reduce/2,你可以这样做:

    iex(3)> {evens, odds} = [1, 2, 3, 4, 5] |> Enum.reduce({[], []}, fn n, {evens, odds} ->
    ...(3)>   if Integer.is_even(n), do: {[n | evens], odds}, else: {evens, [n | odds]}
    ...(3)> end)
    {[4, 2], [5, 3, 1]}
    iex(4)> {Enum.reverse(evens), Enum.reverse(odds)}
    {[2, 4], [1, 3, 5]}
    

    【讨论】:

    • 值得注意的是,Enum.partition/2 函数已被弃用,取而代之的是 Enum.split_with/2
    【解决方案2】:

    或者你可以使用 Erlang :lists 模块:

    iex> :lists.partition(fn (n) -> rem(n, 2) == 1 end, [1,2,3,4,5])
    {[1,3,5],[2,4]}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-06
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      • 2017-04-25
      相关资源
      最近更新 更多