Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 19.11.2021
Сообщений: 78

Возврат списка, сформированный из исходного списка, но не содержащий повторов

05.04.2023, 22:16. Показов 1337. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Разработайте функции для выполнения следующих операций со списками:
1.Возврат списка, сформированный из исходного списка, но не содержащий повторов (остаётся только первый из одинаковых элементов).( вообще не представляю как сделать)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.04.2023, 22:16
Ответы с готовыми решениями:

Возврат списка, сформированный из исходного списка, но не содержащий повторов
Разработайте функции для выполнения следующих операций со списками: 7. Возврат списка, сформированный из исходного списка, но не...

Из исходного списка создать список пар: [элемент, количество подряд идущих повторов]
Здравствуйте, товарищи. Нуждаюсь в Вашей помощи. Задача такая: из исходного списка создать список пар, в котором первый элемент...

Для исходного сложного числового списка, построить список, состоящий из элементов исходного списка, отрицательные числа в котором заменены 0
Для исходного сложного числового списка, построить список, состоящий из элементов исходного списка, отрицательные числа в котором заменены...

14
 Аватар для TimutGin
515 / 339 / 146
Регистрация: 16.02.2021
Сообщений: 626
05.04.2023, 22:32
Python
1
2
3
4
5
def func(lst):
    return list(set(lst))
 
a = [1,1,1,2,2,2,3,3,4,4,4,5,5,6]
print(func(a))
или
Python
1
2
3
4
5
6
7
8
def func(lst):
    b=[]
    for i in a:
        if i not in b:
            b.append(i)
    return b
a = [1,1,1,2,2,2,3,3,4,4,4,5,5,6]
print(func(a))
3
Любознательный
 Аватар для YuS_2
7406 / 2256 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
05.04.2023, 22:52
Python
1
2
3
4
def func(a):
    return list(set(a))
 
print(func([1,1,1,2,2,2,3,3,4,4,4,5,5,6]))
1
740 / 622 / 151
Регистрация: 04.03.2022
Сообщений: 1,272
06.04.2023, 09:29
Поправьте меня, если я ошибаюсь, но ведь set - неупорядоченный набор? И в результате не гарантируется то, что ТС озвучил? Я про "остаётся только первый из одинаковых элементов"
1
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
06.04.2023, 09:38
Цитата Сообщение от Parramon Посмотреть сообщение
set - неупорядоченный набор? И в результате не гарантируется
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38195 / 21128 / 4309
Регистрация: 12.02.2012
Сообщений: 34,734
Записей в блоге: 14
06.04.2023, 10:27
Цитата Сообщение от Parramon Посмотреть сообщение
остаётся только первый из одинаковых элементов
- а чем первый отличается от второго?
1
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
06.04.2023, 10:46
Catstail, порядком вхождения же
1
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
06.04.2023, 11:21
Catstail, еще __contains__ для списка (оператор in) во втором случае смотрит только на __eq__, а множество сначала проверяет __hash__ и только в случае равенства смотрит на __eq__. Так что, формально, можно сломать хэш-функцию у объектов списка и получить существенно разные результаты.
1
Модератор
Эксперт Python
 Аватар для Fudthhh
2696 / 1602 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
06.04.2023, 11:30
Python
1
2
def foo(elements: list[int]) -> list[int]:
    return [elements[0]] + [e1 for e1, e2 in zip(elements[1:], elements[:-1]) if e1 != e2]
Добавлено через 2 минуты
Ну или как вариант:
Python
1
2
def foo(elements: list[int]) -> list[int]:
    return [e1 for e1, e2 in zip(elements, elements[1:] + [None]) if e1 != e2]
1
Любознательный
 Аватар для YuS_2
7406 / 2256 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
06.04.2023, 20:05
Цитата Сообщение от Parramon Посмотреть сообщение
но ведь set - неупорядоченный набор?
Да.
Цитата Сообщение от Parramon Посмотреть сообщение
остаётся только первый из одинаковых элементов
There can be only one!
В чем отличие первого от последующих, если они удаляются как дубли? Как проверить, какой именно элемент остался?

Цитата Сообщение от rRczZZ Посмотреть сообщение
Так что, формально, можно сломать хэш-функцию у объектов списка и получить существенно разные результаты.
Теоретически... что один человек сделал, другой завсегда поломать сможет...
а практически - наверное, пример был бы уместен...
1
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
06.04.2023, 22:03
Лучший ответ Сообщение было отмечено Pinepl как решение

Решение

Цитата Сообщение от YuS_2 Посмотреть сообщение
а практически - наверное, пример был бы уместен...
ну мне не сложно
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class tc:
    unique_id_counter = 0
 
    def __init__(a, x):
        (a.x, a.id)= (x, tc.unique_id_counter)
        tc.unique_id_counter += 1
 
    def __eq__(a, b): return a.x == b.x
    def __hash__(a): return a.id
    def __repr__(a): return repr((a.x, a.id))
 
source = [tc('B'), tc('A'), tc('C'), tc('A')]
print(list(set(source))) # BACA, но порядок не определён, __eq__ не будет вызван для этих данных
print(list(dict.fromkeys(source))) # BACA, в этом порядке, __eq__ не будет вызван для этих данных
print([x for i, x in enumerate(source) if x not in source[:i]]) # BAC, вызывается только __eq__
П.С. про то что словарь с какой-то там версии питона хранит ключи в порядке в котором они были добавлены (я не злопамятный ) написано в документации:
Performing list(d) on a dictionary returns a list of all the keys used in the dictionary, in insertion order (if you want it sorted, just use sorted(d) instead).
1
740 / 622 / 151
Регистрация: 04.03.2022
Сообщений: 1,272
06.04.2023, 22:10
YuS_2, это был чисто формальный вопрос.
0
Любознательный
 Аватар для YuS_2
7406 / 2256 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
06.04.2023, 22:15
Цитата Сообщение от rRczZZ Посмотреть сообщение
мне не сложно
Понятно... но не ясно
Про словари вообще речь у нас не шла... оставим пока в стороне
Остальное проясним?
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class tc:
    unique_id_counter = 0
 
    def __init__(a, x):
        (a.x, a.id)= (x, tc.unique_id_counter)
        tc.unique_id_counter += 1
 
    def __eq__(a, b): return a.x == b.x
    def __hash__(a): return a.id
    def __repr__(a): return repr((a.x, a.id))
 
source = [tc('B'), tc('A'), tc('C'), tc('A')]
print(source)
print('- здесь нет дублей в source.\nСоздадим его:')
source += [source[0]]
print(source)
print('\nДубль получен, проверяем:')
print(source[0] == source[-1])
print('\nНу и собственно, сам list(set()):')
print(list(set(source)))
print('-всё ожидаемо получилось или нет?')
??

Цитата Сообщение от rRczZZ Посмотреть сообщение
я не злопамятный
Надеюсь, про злопамятность - я тут не при чем? В смысле, вроде бы, там я ничего не писал...
1
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
07.04.2023, 00:56
Цитата Сообщение от YuS_2 Посмотреть сообщение
здесь нет дублей в source
Здесь есть "дубли" в source, а именно print(source[1] == source[3]) -> True и вариант с оператором in и списком (из первого поста в теме и третий в моём коде) удаляет их, т.к. в этом случе дубли определяются только исходя из результата метода __eq__ (который также вызывается при встрече оператора ==, используемом Вами в print).

А вот множества и словари считают "дублями" только те объекты, у которых одновременно совпадают результаты __hash__ и __eq__ равен True. Многие рекомендации советуют выбирать хэш-функции, для которых из hash(x) != hash(y) следует x != y, но в посте ТС ничего не говорится о типах элементов списка, соответственно, я привел пример такого списка, для которого алгоритмы из ответа господина TimutGin будут давать разные результаты не только порядком следования элементов, но и длиной.

Цитата Сообщение от YuS_2 Посмотреть сообщение
Про словари вообще речь у нас не шла
Словари решают проблему сохранения порядка следования элементов, которую тут затронули. Если порядок важен и у элементов списка правильно реализована хэш-функция, то имхо list(dict.fromkeys(source)) вполне себе достойный вариант решения задачи ТС.
1
Любознательный
 Аватар для YuS_2
7406 / 2256 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
07.04.2023, 08:46
Лучший ответ Сообщение было отмечено Pinepl как решение

Решение

Цитата Сообщение от rRczZZ Посмотреть сообщение
Здесь есть "дубли"
Хмм...
Тогда просто таки необходимо договариваться о терминологии:
Дубликат - точная копия чего-либо, полностью заменяющая оригинал...
Метод проверки объекта на идентичность, должен проверять все его свойства, иначе можно говорить только о проверке на дубли некоторых атрибутов объекта, но сами объекты уже, в таком случае, могут и не являться дубликатом другого объекта в целом.
Исходя из этого:
Цитата Сообщение от rRczZZ Посмотреть сообщение
print(source[1] == source[3]) -> True
данный метод проверяет на идентичность только значение экземпляра класса, что не делает из объекта дубликат, в полном смысле, т.к. у каждого экземпляра класса присутствует уникальное свойство id.
Подробности реализации методов, в данном случае, значения не имеют.

Цитата Сообщение от rRczZZ Посмотреть сообщение
но в посте ТС ничего не говорится о типах элементов списка, соответственно, я привел пример такого списка
Там говорится о повторах элементов, а не о повторах отдельных их свойств, т.е. если опускаются подробности, то объект (элемент списка, в данном случае) просто обязан быть полным дубликатом, иначе это вовсе не повтор/дубликат... что, собственно, Вы своим примером класса и доказали.

То, что выглядит повтором, может совсем им не являться...
Пример для Вашего кода:
Python
1
2
...
source += [('B', 0)]
приведет к значению source:
[('B', 0), ('A', 1), ('C', 2), ('A', 3), ('B', 0)]
но:
Python
1
2
print(list(set(source)))
[('B', 0), ('A', 1), ('C', 2), ('A', 3), ('B', 0)]
также как и:
Python
1
2
print(list(dict.fromkeys(source)))
[('B', 0), ('A', 1), ('C', 2), ('A', 3), ('B', 0)]
потому, что:
Python
1
2
type(source[0]) == type(source[-1])
False
Что касается словарей...
Заметьте, я вовсе не спорю с тем, что их можно, а в случае, если требуется сохранить порядок следования, то и нужно использовать для условий задачи, описанной ТС-ом... просто в ней не было такого требования.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.04.2023, 08:46
Помогаю со студенческими работами здесь

Сформировать список, содержащий последние n элементов исходного списка
4)Дан список. Сформировать список, содержащий последние n элементов исходногосписка. Предусмотреть случай если n больше длины списка.

Получить список, содержащий все элементы исходного списка, но по одному
Здравствуйте! Помогите, пожалуйста, с решением следующей задачи: Получить список, содержащий все элементы исходного списка, но по...

Сформировать список, содержащий только отрицательные элементы исходного числового списка
Помогите кто сможет бьюсь головой об стол не знаю как!! Формировать список, содержащий только отрицательные элементы исходного числового...

Функция должна возвращать список, содержащий элементы исходного списка, перечисленные в обратном порядке
Функция должна возвращать список, содержащий элементы исходного списка (в том числе входящие в подсписки), перечисленные в обратном...

Опишите функцию, которая из исходного списка формирует список, содержащий только символьные атомы
Опишите функцию, которая из исходного списка формирует список, содержащий только символьные атомы.


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru