Я ищу, чтобы запустить список идентификаторов и вернуть список всех идентификаторов, которые произошли более одного раза. Это было то, что я установил, что работает:Удалить уникальные значения из списка и сохранить только дубликаты
singles = list(ids)
duplicates = []
while len(singles) > 0:
elem = singles.pop()
if elem in singles:
duplicates.append(elem)
Но список идентификаторов, вероятно, получить довольно долго, и я реально не хочу время цикла определяющегося дорогой лены вызов, если я могу избежать его. (Я мог бы пойти неэлегантным путем и позвонить len один раз, а затем просто уменьшить его на каждую итерацию, но я бы предпочел избежать этого, если бы мог).
Я думаю, что это было бы более эффективно с помощью 'itertools.ifilter'. (я писал ответ с 'Counter' и' ifilter', но вы делаете это быстрее;)) – Kasramvd
@ Kasra: Почему? Использование 'filter' /' ifilter' вместо выражения выражения expression/list означает, что вы должны обернуть тест внутри функции, что добавляет дополнительную стоимость. (Если бы вы просто ссылались на не создание списка, если нам это не нужно, тем проще сделать это, просто изменить listcomp на ген xpr, но поскольку он специально говорит, что ему нужно вернуть список, t думаю, что вы можете избежать создания списка.) – abarnert
@Kasra: Первый список просто создает тестовые данные. Вам нужно получить входные данные откуда-то. – abarnert