Удалить несколько элементов из списка - PullRequest
0 голосов
/ 01 ноября 2018

Учитывая этот список:

list = [1,2,3,4,5]

как я могу вернуть новый список с этими элементами?

[3,4,5]

Я знаю, что использую List.delete/2, но, насколько я могу судить, удаляет только 1 элемент за раз. Я хочу удалить первые два элемента одним махом.

Ответы [ 4 ]

0 голосов
/ 20 марта 2019

Другой подход, который может быть динамическим в зависимости от вашей реализации, - Enum.filter/2

Это будет выглядеть примерно так:

Enum.filter(list, &(&1 >= 3))

=> [3,4,5]
0 голосов
/ 02 ноября 2018

Чтобы вывести только первые 2 элемента: вы можете сопоставить шаблон так:

[_,_|sublist] = list

Вы также можете использовать tl/1 дважды:

list |> tl() |> tl ()

Однако это последнее решение не делает это одним махом.

Если количество отбрасываемых элементов варьируется, я не вижу другого решения, предложенного @Dogbert: использовать Enum.drop/2 или также Enum.split/2, как это :

{_,sublist} = Enum.split(list,2)
0 голосов
/ 03 ноября 2018

Если вы хотите удалить элементы на основе какого-либо произвольного условия, вы можете использовать Enum.reject/2 и предоставить условие отклонения в качестве аргумента.

iex(1)> Enum.reject([1,2,3,4,5], fn x -> x in [1,2] end)
[3, 4, 5]
0 голосов
/ 01 ноября 2018

Я думаю, что вы ищете это

# Example with static values
iex> [1, 2, 3, 4, 5] -- [1, 2]
[3, 4, 5]

# Example with Enum.drop/2, with multiple values
iex> Enum.drop([1, 2, 3, 4, 5], 2)
[3, 4, 5]
iex> Enum.drop([1, 2, 3, 4, 5], -2)
[1, 2, 3]
iex> Enum.drop([1, 2, 3, 4, 5], 20)
[]
iex> Enum.drop([1, 2, 3, 4, 5], -20)
[]

Вы можете использовать List.delete/2, можете удалять только по одному, а Enum.drop/2 может удалять несколько, в зависимости от того, как вы его используете.

...