Страницы

Поиск по вопросам

вторник, 2 апреля 2019 г.

Вернуть массив, состоящий только из неуникальных элементов данного массива

def A(number) :
for item in range(len(number)) : if number.count(item) < 2 : # определяю уникальный или нет number[item] *= 0 # превращаю уникальный в ноль
for i, elem in enumerate(number) : if elem == 0 : del number[i] # если ноль - удаляю return number
Дан непустой массив целых чисел. Нужно вернуть массив, состоящий только из неуникальных элементов данного массива. Для этого необходимо удалить все уникальные элементы (которые присутствуют в данном массиве только один раз). Нельзя менять оригинальный порядок элементов.
Мой код работает, но убирает только первый уникальный элемент, а остальные не трогает.Почему, не знаю, но хотел бы узнать.
Если дается [1, 2, 3, 3, 3] , то должно вернуться - [3, 3, 3]. А у меня возвращается - [2, 3, 3, 3].


Ответ

Вот в этом куске
for i, elem in enumerate(number) : if elem == 0 : del number[i] # если ноль - удаляю
Вы удаляете элементы из того списка, по которому итерируетесь. Так делать нельзя, иначе после удаления элемента цикл будет перескакивать через следующий элемент (потому что после удаления предыдущего он сдвинулся на его место).
Поэтому некоторые элементы у вас и не удаляются - в цикле они просто проскальзывают мимо.
Вообще, нужно стараться заменять циклы списковыми выражениями там, где это возможно.
Например, вашу функцию можно написать в одну строчку:
def A(number) : return [i for i in number if number.count(i) > 1]

Комментариев нет:

Отправить комментарий