Как удалить неуникальные элементы из списка, введенного через функцию ввода? - PullRequest
0 голосов
/ 09 июля 2019

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

def non_unique_numbers(line):
    for i in line:
        if line.count(i) < 2:
            line.remove(i)
    return line


lin = input('go on then')
line = lin.split()
print(non_unique_numbers(line))

Вывод не согласован, кажется, что время от времени удаляются все остальные, но не удаляются все недубликаты. Пожалуйста, дайте мне знать, где я ошибаюсь.

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Что происходит при выполнении for i in line, так это то, что каждая итерация i получает значение от итератора, созданного для переменной line. Таким образом, изменяя line, вы не меняете итератор.

Итак, при удалении элемента в индексе, скажем, j, все элементы в индексе i > j перемещаются на один индекс вниз. Так что теперь ваш следующий элемент снова будет в индексе j, но цикл все равно продолжится и перейдет к индексу j+1.

Хороший способ убедиться, что ваша функция запускается со значениями, не являющимися дубликатами:

>>> l = [0, 1, 2, 3, 4, 5]
>>> print(non_unique_numbers(l))
[1, 3, 5]

Вы можете видеть, что были удалены только четные значения в соответствии с логикой, описанной выше.

То, что вы хотите сделать, - это работать над новым отдельным списком для суммирования ваших результатов. Для этого вы можете использовать простое понимание списка:

lin = input('go on then')
line = lin.split()
print([x for x in line if line.count(x) > 1])
0 голосов
/ 09 июля 2019

Не безопасно изменять список во время итерации. Реальная проблема, я думаю, заключается в том, что remove () удаляет только первый экземпляр значения, что приведет к сбою проверки <2 для последнего элемента и не вызовет remove (). </p>

Лучше использовать хеш-таблицу, чтобы найти счетчики и вернуть их с <2. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...