Самый эффективный способ сохранить в списке только уникальные предметы? - PullRequest
2 голосов
/ 12 марта 2012

Так что я относительно новичок в Python и пытаюсь выяснить, как лучше всего хранить только уникальные элементы в списке. Моя текущая реализация включает в себя понимания Counter, dict и list, но я не уверен, что может быть быстрее.

Вот пример того, что я пробовал:

l = ['a', 'b', 'a']
d = dict(Counter(l))
[key for key, val in d.items() if val == 1]
>>> ['b']

Кроме того, это работает только для строк, а не для целых, и я не знаю, почему.

Ответы [ 5 ]

5 голосов
/ 12 марта 2012

Хотите ли вы только вещи, которые существуют один раз?

>>> c=Counter(['a','b','a'])
>>> [n for n in c if c[n]==1]
['b']
>>> c=Counter([1,2,3,2,3,4,5,6,5,6])
>>> [n for n in c if c[n]==1]
[1, 4]

Или просто список уникальных вещей?

>>> set([1,2,3,2,3,4,5,6,5,6])
set([1, 2, 3, 4, 5, 6])
4 голосов
/ 12 марта 2012

Python имеет встроенный тип для обеспечения уникальности элементов в списке, это set . Используя ваш пример:

l = ['a', 'b', 'a']
set(l)
>>> ['a','b']

Как правило, вы можете «вымыть» дублирующиеся элементы из списка, преобразовав их из списка в набор и обратно. Например:

l = ['a', 'b', 'a']
list(set(l))
>>> ['a','b']

Это превратит список обратно в изменяемый (редактируемый) список и обеспечит наилучшее сочетание производительности и удобства.

1 голос
/ 12 марта 2012

Ничего плохого в том, как ты это делал. Хотя диктат лишний. Это довольно эффективно, но будет работать только в том случае, если все «ключи» можно хэшировать

[k for k,v in Counter(L).iteritems() if v==1]
0 голосов
/ 12 марта 2012

Если вы не заботитесь о заказе, просто используйте set(). Однако следующий порядок сохранит порядок:

l = ['a', 'b', 'c', 'a', 'c', 'd']

a = []
for item in l:
   if item not in a: a.append(item)

Или хранить только уникальные предметы:

l = [item for item in l if l.count(item) == 1]
0 голосов
/ 12 марта 2012

Если вы хотите удалить повторяющиеся элементы, используйте set , а затем преобразовайте результат в список:

ls = [1, 2, 3, 3, 3, 'a', 'b', 'b', 'c']
unique = list(set(ls))
# unique is ['a', 1, 2, 3, 'c', 'b']

Обратите внимание, что эта операция не сохранит порядок элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...