У меня есть список в Python, как я могу сделать его уникальным?
Как создавать списки содержат только отдельный элемент в Python?
Ответ 1
Простейшим является преобразование в набор, а затем обратно в список:
my_list = list(set(my_list))
Одним из недостатков этого является то, что он не сохранит порядок. Вы также можете подумать, может ли набор быть лучшей структурой данных для использования, в первую очередь, вместо списка.
Ответ 2
Модифицированные версии http://www.peterbe.com/plog/uniqifiers-benchmark
Чтобы сохранить порядок:
def f(seq): # Order preserving
''' Modified version of Dave Kirby solution '''
seen = set()
return [x for x in seq if x not in seen and not seen.add(x)]
ОК, теперь как это работает, потому что здесь немного сложно if x not in seen and not seen.add(x)
:
In [1]: 0 not in [1,2,3] and not print('add')
add
Out[1]: True
Почему он возвращает True? print (и set.add) ничего не возвращает:
In [3]: type(seen.add(10))
Out[3]: <type 'NoneType'>
и not None == True
, но:
In [2]: 1 not in [1,2,3] and not print('add')
Out[2]: False
Почему он печатает 'add' в [1], но не в [2]? См. False and print('add')
и не проверяет второй аргумент, потому что он уже знает ответ и возвращает true, только если оба аргумента имеют значение True.
Более общая версия, более читаемая, основанная на генераторе, добавляет возможность преобразования значений с помощью функции:
def f(seq, idfun=None): # Order preserving
return list(_f(seq, idfun))
def _f(seq, idfun=None):
''' Originally proposed by Andrew Dalke '''
seen = set()
if idfun is None:
for x in seq:
if x not in seen:
seen.add(x)
yield x
else:
for x in seq:
x = idfun(x)
if x not in seen:
seen.add(x)
yield x
Без порядка (быстрее):
def f(seq): # Not order preserving
return list(set(seq))
Ответ 3
однострочный и сохраняющий порядок
list(OrderedDict.fromkeys([2,1,1,3]))
хотя вам понадобится
from collections import OrderedDict
Ответ 4
Чтобы сохранить порядок:
l = [1, 1, 2, 2, 3]
result = list()
map(lambda x: not x in result and result.append(x), l)
result
# [1, 2, 3]
Ответ 5
Позвольте мне объяснить вам пример:
если у вас есть список Python
>>> randomList = ["a","f", "b", "c", "d", "a", "c", "e", "d", "f", "e"]
и вы хотите удалить из него дубликаты.
>>> uniqueList = []
>>> for letter in randomList:
if letter not in uniqueList:
uniqueList.append(letter)
>>> uniqueList
['a', 'f', 'b', 'c', 'd', 'e']
Вот как вы можете удалить дубликаты из списка.
Ответ 6
Как насчет понимания словаря?
>>> mylist = [3, 2, 1, 3, 4, 4, 4, 5, 5, 3]
>>> {x:1 for x in mylist}.keys()
[1, 2, 3, 4, 5]
ИЗМЕНИТЬ К комментарию @Danny: мое первоначальное предложение не поддерживает порядок клавиш. Если вам нужны отсортированные ключи, попробуйте:
>>> from collections import OrderedDict
>>> OrderedDict( (x,1) for x in mylist ).keys()
[3, 2, 1, 4, 5]
который сохраняет элементы порядка в первом вхождении элемента (не подвергается экстенсивно протестированному)
Ответ 7
Из http://www.peterbe.com/plog/uniqifiers-benchmark:
def f5(seq, idfun=None):
# order preserving
if idfun is None:
def idfun(x): return x
seen = {}
result = []
for item in seq:
marker = idfun(item)
# in old Python versions:
# if seen.has_key(marker)
# but in new ones:
if marker in seen: continue
seen[marker] = 1
result.append(item)
return result
Ответ 8
Если все элементы списка могут использоваться в качестве ключей словаря (т.е. все они хешируются), это часто бывает быстрее. Часто задаваемые вопросы по программированию на Python
d = {}
for x in mylist:
d[x] = 1
mylist = list(d.keys())
Ответ 9
Самый простой способ удалить дубликаты при сохранении порядка - это collections.OrderedDict (Python 2.7 +).
from collections import OrderedDict
d = OrderedDict()
for x in mylist:
d[x] = True
print d.iterkeys()
Ответ 10
Характеристики наборов в Python заключаются в том, что элементы данных в наборе являются неупорядоченными, а дубликаты не допускаются. Если вы попытаетесь добавить элемент данных в набор, который уже содержит элемент данных, Python просто игнорирует его.
>>> l = ['a', 'a', 'bb', 'b', 'c', 'c', '10', '10', '8','8', 10, 10, 6, 10, 11.2, 11.2, 11, 11]
>>> distinct_l = set(l)
>>> print(distinct_l)
set(['a', '10', 'c', 'b', 6, 'bb', 10, 11, 11.2, '8'])