Elixir:将列表拆分为奇数和偶数元素作为元组中的两项

问题描述 投票:0回答:3

我是 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
3个回答
14
投票

您可以使用

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]}

2
投票

或者您可以使用 Erlang

:lists
模块:

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

0
投票

你可以使用

Enum.split_while/2

iex> Enum.split_with([1, 2, 3, 4, 5, 6], &rem(&1, 2) == 1)
{[1, 3, 5], [2, 4, 6]}

另一种解决方案

iex> {Enum.take_every([1, 2, 3, 4, 5, 6], 2), Enum.drop_every([1, 2, 3, 4, 5, 6], 2)}
{[1, 3, 5], [2, 4, 6]}
© www.soinside.com 2019 - 2024. All rights reserved.