@Veked
Только учусь)

Почему не удаляются все элементы списка?

Пытаю решить задачу на checkio. Надо удалить все уникальные элементы. Почему то при вводе списка со всеми уникальными элементами получается такой вывод.

def checkio(data):
    for i in data:
        if data.count(i) < 2:
            data.remove(i)
        return data


checkio([1, 2, 3, 4, 5])            #   >>>   [2, 4]
  • Вопрос задан
  • 361 просмотр
Решения вопроса 2
mututunus
@mututunus
Backend developer (Python, Golang)
def checkio(data):
    return [i for i in data if data.count(i)>1]
Ответ написан
@psvworks
Отвечу на вопрос, а то все предложили свои варианты, но никто не ответил почему программа не работает. В свое время я тоже написал решение в стиле ТСа, но, естественно, она работала почему-то неправильно. Причина в следующем: если мы перебираем элементы и удаляем какой-либо, то сам элемент удалится, произойдет смещение всех элементов влево (в результате чего их индексы уменьшатся на 1) и при этом итерируемый индекс еще и увеличится на 1 (!). Т.е. каждый раз, когда удаляется уникальный элемент, будет рассматриваться не следующий за ним элемент, а через него. Такие дела.

P.S. Могу посоветовать производить перебор элементов списка через их индексы из range(len(data)), и после каждого удаления уникального элемента производить корректировку индекса i = i - 1 (но это будет не питоновский стиль ;) )
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
AnnTHony
@AnnTHony
Интроверт
import copy

def checkio(data):
	xdata = copy.deepcopy(data)
	for i in data:
		if (xdata.count(i) < 2):
			xdata.remove(i)
	return xdata
Ответ написан
Комментировать
@nirvimel
С точки зрения производительности так будет быстрее:
from collections import Counter

def checkio(data):
    c = Counter(data)
    return [i for i in data if c[i] > 1]
Ответ написан
@GeneD88
QA
def checkio(data):
    for i in data[-1::-1]:
        if data.count(i) < 2:
            data.remove(i)
    return data

checkio([1, 2, 3, 4, 5, ])             #   >>>   []
checkio([1, 2, 3, 4, 5, 4])             #   >>>   [4,4]
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы