Форум программистов, компьютерный форум, киберфорум
F# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
1 / 1 / 1
Регистрация: 13.06.2015
Сообщений: 9

Удаление повторяющихся элементов в списке

13.06.2015, 15:14. Показов 3595. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Только начали изучать F#, поэтому есть затруднение с написанием программы.
Нужно удалить из списка повторяющиеся элементы двумя способами:
Первый. Если элемент в списке встречается более 1 раза, удалить его повторения. Т.е. [1; 2; 2; 3] -> [1;2;3]
Второй. Если элемент в списке встречается более 1 раза, удалить все вхождения этого эл-та. Т.е. [1;1;2]->[2]
Прошу помочь с любым из этих примеров, с остальным разберусь сама
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.06.2015, 15:14
Ответы с готовыми решениями:

Удаление повторяющихся значений в линейном списке
Проблема в цикле в функции ChangeList(вылезает NullReferenceException). using System; using System.Collections.Generic; using...

Удаление повторяющихся элементов в ArrayList
В цикле с помощью Add добавляю строки в массив ArrayList ArrayList temp = new ArrayList(); Теперь мне необходимо удалить...

Удаление повторяющихся элементов в ArrayList
Есть метод в котором открывается файл и далее происходит запись столбцов (но это не важно) public ArrayList getTableArray() ...

11
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
13.06.2015, 15:34
Цитата Сообщение от AnnaKon Посмотреть сообщение
Прошу помочь с любым из этих примеров, с остальным разберусь сама
ну сама так сама http://ideone.com/4gAlV4
F#
1
2
3
4
5
let rec removeDups xs =
    match xs with
    | h :: k :: t when h = k -> removeDups (h :: t)
    | h :: t                 -> h :: removeDups t
    | []                     -> []
2
Заблокирован
13.06.2015, 16:33
Лучший ответ Сообщение было отмечено Ev_Hyper как решение

Решение

Цитата Сообщение от AnnaKon Посмотреть сообщение
Второй. Если элемент в списке встречается более 1 раза, удалить все вхождения этого эл-та. Т.е. [1;1;2]->[2]
AnnaKon, второй:
F#
1
2
let remove lst =
    lst |> List.filter(fun x-> (lst |> List.filter(fun y -> y = x)).Length = 1)
или нужно без использовать стандартных функций?
1
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,149
Записей в блоге: 43
13.06.2015, 16:34
pycture, так это ведь удалит повторы, только если они рядом будут идти.
0
Заблокирован
13.06.2015, 17:21
Цитата Сообщение от AnnaKon Посмотреть сообщение
Первый. Если элемент в списке встречается более 1 раза, удалить его повторения. Т.е. [1; 2; 2; 3] -> [1;2;3]
AnnaKon, первый:
F#
1
2
let removes lst =
    lst |> Seq.distinct |> Seq.toList
Цитата Сообщение от diadiavova Посмотреть сообщение
так это ведь удалит повторы, только если они рядом будут идти.
верно. Но можно просто добавить сортировку:

F#
1
2
3
4
5
6
7
let removeD xs =
    let rec removeDups xs = 
        match xs with
        | h :: k :: t when h = k -> removeDups (h :: t)
        | h :: t                 -> h :: removeDups t
        | []                     -> []
    removeDups (xs |> List.sort)
естественно порядок не сохранится.
0
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,149
Записей в блоге: 43
13.06.2015, 17:27
Лучший ответ Сообщение было отмечено Ev_Hyper как решение

Решение

Цитата Сообщение от Ev_Hyper Посмотреть сообщение
естественно порядок не сохранится.
Если порядок не важен, то это обычно в условии оговаривается. В принципе с сохранением порядка можно так сделать.
F#
1
2
3
4
5
6
7
let distinct (l:'a list) =
    let rec dist src result = 
        match src with
        | h::t when List.exists ((=) h) result -> dist t result
        | h::t ->  dist t (h::result)
        | _ -> result
    List.rev (dist l [])
Но как-то это тоже не очень красиво. А если уж совсем обнаглеть, то можно с помощью Seq.distinct решить )))
1
Заблокирован
13.06.2015, 17:40
Цитата Сообщение от diadiavova Посмотреть сообщение
Но как-то это тоже не очень красиво.
diadiavova, красиво. Но тип можно не указывать явно:
F#
1
2
3
let distinct l =
    let rec dist src result =
    ...
0
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,149
Записей в блоге: 43
13.06.2015, 17:45
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
diadiavova, красиво. Но тип можно не указывать явно:
А там по-моему чойт ругался компилятор. Возможно не на окончательный вариант, а в процессе. А насчет Seq.distinct, вот
F#
1
let listdistinct l = l |> Seq.ofList |> Seq.distinct |> Seq.toList
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
13.06.2015, 17:57
F#
1
2
3
4
5
6
7
8
9
10
let rec remove1 xs =
        match xs with
        | h :: t -> h :: remove1 (List.filter ((<>)h) t)
        | []     -> []
 
let rec remove2 xs =
        match xs with
        | h :: t when List.exists ((=)h) t -> remove2 (List.filter ((<>)h) t)
        | h :: t -> h :: remove2 t
        | []     -> []
0
Заблокирован
13.06.2015, 18:01
Лучший ответ Сообщение было отмечено Ev_Hyper как решение

Решение

Цитата Сообщение от diadiavova Посмотреть сообщение
А насчет Seq.distinct, вот
diadiavova, я его уже приводил в 5 посте

Цитата Сообщение от diadiavova Посмотреть сообщение
А там по-моему чойт ругался компилятор. Возможно не на окончательный вариант, а в процессе.
ругался до использования List.exists

Еще 1 вариант:

F#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let removeD2 lst = 
    let equal xs el = 
        let rec eq lst = 
            match lst with
            | h::t when h = el -> false
            | h::t -> eq t 
            | [] -> true
        eq xs
    
    let rec dist xs = 
        match xs with
        | h::t when (equal t h = false) -> dist t
        | h::t                          -> h::dist t
        | []                            -> []
    dist (lst |> List.rev)
    |> List.rev
F#
1
2
3
[1; 2; 2; 3; 1; 0; 2; 1] |> printfn "%A"
 
[1; 2; 2; 3; 1; 0; 2; 1] |> removeD2 |> printfn "%A"
Code
1
2
[1; 2; 2; 3; 1; 0; 2; 1]
[1; 2; 3; 0]
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
13.06.2015, 18:13
Лучший ответ Сообщение было отмечено Ev_Hyper как решение

Решение

F#
1
2
3
4
5
6
7
let remove1 xs =
    let rec loop f xs =
        match xs with
        | h :: t when f h -> loop f t
        | h :: t -> h :: loop (fun x -> h = x || f x) t
        | []     -> []
    loop (fun _ -> false) xs
Добавлено через 11 минут
F#
1
2
3
4
5
6
7
8
9
10
11
12
let rec remove1 xs =
        match xs with
        | h :: t -> match List.partition ((=)h) t with
                    | _, t -> h :: remove1 t
        | []     -> []
 
let rec remove2 xs =
        match xs with
        | h :: t -> match List.partition ((=)h) t with
                    | [], t -> h :: remove2 t
                    | _ , t -> remove2 t
        | []     -> []
0
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,149
Записей в блоге: 43
13.06.2015, 18:34
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
diadiavova, я его уже приводил в 5 посте
Точно, не заметил.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.06.2015, 18:34
Помогаю со студенческими работами здесь

Удаление повторяющихся элементов массива
Ребят, как можно вывести только неповторяющиеся элементы массива двумерного??? using System; using System.Collections.Generic; using...

Удаление повторяющихся элементов в массиве
Здравствуйте. есть такая задача: существует объект класса ArrayList в котором хранятся значения даты (12 июня 2012 г.) Нужно...

Удаление повторяющихся элементов в массиве
Подскажите как реализовать удаление одинаковых чисел из массива? чем проще тем лучше Спасибо.

Удаление повторяющихся элементов из xml файла
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;head&gt; &lt;element id=&quot;0&quot;&gt; &lt;name&gt;1&lt;/name&gt; &lt;/element&gt; &lt;element id=&quot;0&quot;&gt; ...

Удаление повторяющихся элементов в List<string>
private List&lt;string&gt; _teachers; public List&lt;string&gt; teachers { get { return _teachers; } ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru