Как скопировать элементы в списке разное количество раз? - PullRequest
0 голосов
/ 17 июня 2020

Если у меня есть список, состоящий из элементов [5;10;15], как я могу получить выходной массив, в котором количество раз, когда элемент x из входного списка повторяется x/5 раз, или с использованием любого другого интегрального выражения для указания количество повторов?

Итак, как и для этого списка, ожидаемый результат должен быть [5; 10; 10; 15; 15; 15]

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Сначала преобразуйте каждый элемент входного списка в список с таким количеством элементов. Чтобы преобразовать каждый элемент списка, используйте List.map. Чтобы создать список с заданным количеством элементов, используйте List.replicate:

let f lst = 
    lst 
    |> List.map (fun x -> List.replicate (x/5) x)

Давайте проверим это:

> f [5; 10]
[ [5]; [10; 10] ]

А затем все, что осталось сделать, это объединить все эти списки в большой список, используя List.concat:

let f lst = 
    lst 
    |> List.map (fun x -> List.replicate (x/5) x)
    |> List.concat

Или вы можете объединить map и concat вместе в collect:

let f lst = 
    lst 
    |> List.collect (fun x -> List.replicate (x/5) x)
0 голосов
/ 17 июня 2020

Вы можете определить следующую функцию, возвращающую последовательность, используя выражение последовательности с вложенными for циклами:

let repeatedSeq (s, itemCount) = 
    seq { for item in s do for i in 1..itemCount(item) -> item }

А затем выполните:

let list = [5; 10; 15]
let repeatedList = repeatedSeq(list, fun i -> i/5) |> Seq.toList

Что приводит к [5; 10; 10; 15; 15; 15] по мере необходимости. Этот подход позволяет избежать материализации любых промежуточных последовательностей в виде списков или массивов.

Если вы хотите, чтобы конечный результат был массивом, сделайте вместо этого |> Seq.toArray.

Демо-скрипт здесь .

...