если ваш список не отсортирован, тогда ваш вопрос не имеет смысла.например, [1,2,1] может стать [1,2] или [2,1]
, если ваш список большой, вы можете записать свой результат обратно в тот же список, используя SLICEчтобы сохранить в памяти :
>>> x=['a', 'a', 'a', 'b', 'b', 'c', 'd']
>>> x[:]=[x[i] for i in range(len(x)) if i==0 or x[i]!=x[i-1]]
>>> x
['a', 'b', 'c', 'd']
для встроенного удаления см. Удаление элементов из списка при повторении или Удаление элементов из списка при повторении без использования дополнительной памяти вPython
один прием, который вы можете использовать, заключается в том, что если вы знаете, что x отсортирован, и знаете, что x [i] = x [i + j], то вам не нужно ничего проверять между x [i] и x [i + j] (и если вам не нужно удалять эти значения j, вы можете просто скопировать нужные значения в новый список)
Так что пока вы не можете разбить nоперации, если все в наборе уникально, т. е. len (set (x)) = len (x). Вероятно, существует алгоритм, который имеет n сравнений в худшем случае, но может иметь n / 2 сравнений в качестве наилучшего (или ниже n)./ 2 в лучшем случае, если вы как-то знаете, заранее знаете, что len (x) / len (set (x))> 2 из-за сгенерированных вами данных):
оптимальный алгоритм, вероятно, будет использовать бинарный поиск, чтобы найти максимум j для каждого минимума i в подходе типа «разделяй и властвуй».Начальные деления, вероятно, будут иметь длину len (x) / приблизительную (len (set (x))).Надеюсь, это можно сделать так, что даже если len (x) = len (set (x)), он все равно использует только n операций.