как удалить дубликаты из списка python и сохранить порядок?

<p>учитывая список строк, я хочу отсортировать его по алфавиту и удалить дубликаты. я знаю, что я могу сделать это:</p><pre><code>from sets import set [...] myhash = set(mylist) </code></pre><p>но я не знаю, как получить список членов из хеша в алфавитном порядке.</p><p>я не женат на хэше, поэтому любой способ добиться этого сработает. кроме того, производительность не является проблемой, поэтому я бы предпочел решение, которое четко выражено в коде, быстрому, но более непрозрачному.</p>

<p>список может быть отсортирован и дедуплицирован с помощью встроенных функций:</p><pre><code>mylist = sorted(set(mylist)) </code></pre><ul> <li> <a href="http://docs.python.org/library/functions.html#func-set"><code>set</code></a> это встроенная функция для python> = 2.3</li> <li> <a href="http://docs.python.org/library/functions.html#sorted"><code>sorted</code></a> это встроенная функция для python> = 2.4</li> </ul>

<p>если ваши входные данные уже отсортированы, возможно, существует более простой способ сделать это:</p><pre><code>from operator import itemgetter from itertools import groupby unique\_list = list(map(itemgetter(0), groupby(yourlist))) </code></pre>

<p>если вы хотите сохранить порядок исходного списка, просто используйте ordereddict с <code>none</code> в качестве значений.</p><p>в python2:</p><pre><code> from collections import ordereddict from itertools import izip, repeat unique\_list = list(ordereddict(izip(my\_list, repeat(none)))) </code></pre><p>в python3 это еще проще:</p><pre><code> from collections import ordereddict from itertools import repeat unique\_list = list(ordereddict(zip(my\_list, repeat(none)))) </code></pre><p>если вам не нравятся итераторы (zip и repeat), вы можете использовать генератор (работает как в 2 и 3):</p><pre><code> from collections import ordereddict unique\_list = list(ordereddict((element, none) for element in my\_list)) </code></pre>

<p>если вам нужна ясность, а не скорость, я думаю, это очень ясно:</p><pre><code>def sortanduniq(input): output = [] for x in input: if x not in output: output.append(x) output.sort() return output </code></pre><p>это o (n ^ 2), хотя, с повторным использованием not in для каждого элемента списка ввода.</p>

<p>> но я не знаю, как извлечь список членов из хеша в алфавитном порядке.</p><p>не совсем ваш главный вопрос, но для дальнейшего использования ответ рода, использующий <code>sorted</code>, может использоваться для обхода ключей <code>dict</code> в отсортированном порядке:</p><pre><code>for key in sorted(my\_dict.keys()): print key, my\_dict[key] ... </code></pre><p>а также потому, что <code>tuple</code> упорядочены первым членом кортежа, вы можете сделать то же самое с <code>items</code>:</p><pre><code>for key, val in sorted(my\_dict.items()): print key, val ... </code></pre>

<p>для строковых данных</p><pre><code> output = [] def uniq(input): if input not in output: output.append(input) print output </code></pre>