Получение уникальных значений из списка в Python
У меня есть задача, связанная с удалением дубликатов из списка. У меня есть следующий список:
['nowplaying', 'PBS', 'PBS', 'nowplaying', 'job', 'debate', 'thenandnow']
Мне нужно получить уникальные значения, и ожидаемый результат выглядит так:
['nowplaying', 'PBS', 'job', 'debate', 'thenandnow']
Я использую следующий код для достижения этой цели:
output = []
for x in trends:
if x not in output:
output.append(x)
print(output)
Этот код работает, но мне интересно, есть ли более эффективное решение для этой задачи? Буду признателен за советы и оптимизации!
5 ответ(ов)
Чтобы обеспечить согласованность с типом, я бы использовал следующий код:
mylist = list(set(mylist))
Этот подход преобразует ваш список в множество, удаляя дубликаты, а затем снова в список, что гарантирует, что вы получите уникальные элементы.
Чтобы получить уникальные элементы из списка в Python, вы можете преобразовать его в множество (set), которое автоматически удалит дублирующиеся значения. Если вам нужно вернуть результат обратно в список, вы можете сделать это, создав новый список из множества.
Вот пример:
>>> a = ['a', 'b', 'c', 'd', 'b']
>>> b = set(a)
>>> print(b)
{'b', 'c', 'd', 'a'}
Если вы хотите получить результат в виде списка, вы можете сделать так:
>>> unique_list = list(b)
>>> print(unique_list)
Обратите внимание, что элементы в множестве не упорядочены, поэтому порядок уникальных элементов в списке может отличаться от исходного списка.
Вопрос: Как эффективно удалить дубликаты из списка в Python, сохранив порядок?
Ответ: Вот несколько вариантов решения этой задачи:
- Медленный метод (сохраняет порядок, но медленно):
# Медленный способ - время выполнения: 14.417 секунд
[x for i, x in enumerate(array) if x not in array[0:i]]
- Быстрый метод (сохраняет порядок):
# Быстрый способ - время выполнения: 0.0378 секунд
[x for i, x in enumerate(array) if array.index(x) == i]
- Самый быстрый метод (сохраняет порядок):
# Самый быстрый способ - время выполнения: 0.012 секунд
uniq = []
[uniq.append(x) for x in array if x not in uniq]
uniq
Если порядок не имеет значения, есть еще более быстрый способ:
- Самый быстрый вариант (без сохранения порядка):
# Самый быстрый способ (порядок не важен) - время выполнения: 0.0035 секунд
list(set(array))
Надеюсь, это поможет вам выбрать подходящее решение в зависимости от ваших требований к производительности и порядку элементов!
set
— это неупорядоченная коллекция уникальных элементов. Можно передать список элементов в конструктор set
. Если передать список с дубликатами, мы получим set
с уникальными элементами, а затем, преобразовав его обратно в список, снова получим список с уникальными элементами. Не могу ничего сказать о производительности и потреблении памяти, но, надеюсь, это не так важно для небольших списков.
list(set(my_not_unique_list))
Вы можете создать уникальный список элементов из исходного списка, сохраняя порядок, используя только списковое включение. Вот пример:
my_list = [1, 2, 1, 3, 2, 4, 3, 5, 4, 3, 2, 3, 1]
unique_list = [
e
for i, e in enumerate(my_list)
if my_list.index(e) == i
]
Здесь enumerate
возвращает индекс i
и элемент e
в виде кортежа. Выражение my_list.index(e)
возвращает первый индекс элемента e
. Если этот индекс не совпадает с i
, значит, текущий элемент e
не является первым в списке.
Примечание: Стоит отметить, что этот способ неэффективен с точки зрения производительности. Это просто один из способов достижения цели, используя только списковое включение.
Как получить последний элемент списка?
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Самый быстрый способ проверить наличие значения в списке
Сравнение: генераторы списков против lambda + filter
Как отсортировать список/кортеж списков/кортежей по элементу на заданном индексе