Как создавать списки содержат только отдельный элемент в 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

Ответ 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'])