2010-08-25 2 views
3
In [1]: l1 = ['a',2,3,0,9.0,0,2,6,'b','a'] 

In [2]: l2 = list(set(l1)) 

In [3]: l2 
Out[3]: ['a', 0, 2, 3, 6, 9.0, 'b'] 

Здесь Вы можете увидеть список l2 падает с другой последовательностью, то первоначальный l1, мне нужно удалить повторяющиеся элементы из моего списка, не изменяя последовательность/порядок элементов списка ....Как я могу поддерживать последовательность моего списка с помощью set?

+0

@carl - Э? Этот вопрос включает дубликаты в списке списков. Это всего лишь список, но он хочет сделать его уникальным, не избавившись от его внутреннего заказа ... – Stephen

+2

«Как я могу сохранить последовательность моего списка с помощью set?» Наборы ** неупорядочены ** по определению – NullUserException

+0

@advait Относительно моего ответа - Спасибо, я честно не знал, будет ли это держать или нет. Было утро 6 утра, поэтому мне действительно не хотелось загружать питон. Соблазн изменить ответ на использование упорядоченных словарей, но я не слишком хорошо знаком с ними, поэтому я просто удалю ответ, который я думаю. – Stephen

ответ

0

Это от верхней части головы (с помощью dicts):

l1 = ['a',2,3,0,9.0,0,2,6,'b','a'] 
l2 = [] 
s = {} 
for i in l1: 
    if not i in s: 
     l2.append(i) 
     s[i] = None 

# l2 contains ['a', 2, 3, 0, 9.0, 6, 'b', 'a'] 

Edit: Использование множества (также с верхней части моей головы):

l1 = ['a',2,3,0,9.0,0,2,6,'b','a'] 
l2 = [] 
s = set() 
for i in l1: 
    if not i in s: 
     l2.append(i) 
     s.add(i) 
10

Если вы не связана с эффективностью, это O (Н * м)

>>> sorted(set(l1), key=l1.index) 
['a', 2, 3, 0, 9.0, 6, 'b'] 

Использование промежуточного Dict является более сложным, но представляет собой О (п + т * logm)

где п число элементов в l1 и м это число уникальных элементов в l1

>>> l1 = ['a',2,3,0,9.0,0,2,6,'b','a'] 
>>> d1=dict((k,v) for v,k in enumerate(reversed(l1))) 
>>> sorted(d1, key=d1.get, reverse=True) 
['a', 2, 3, 0, 9.0, 6, 'b'] 

В Python3.1 у вас есть OrderedDict так что это очень легко

>>> l1 = ['a',2,3,0,9.0,0,2,6,'b','a'] 
>>> list(OrderedDict.fromkeys(l1)) 
['a', 2, 3, 0, 9.0, 6, 'b'] 
+0

upvote для проблемы сложности @John La Rooy – Ankush

5

Вы можете решить, определив функцию:

def dedupe(items): 
    seen = set() 
    for item in items: 
     if item not in seen: 
      yield item 
      seen.add(item) 

Чтобы использовать его:

>>> l1 = ['a',2,3,0,9.0,0,2,6,'b','a'] 
>>> l2 = list(dedupe(l1)) 
>>> l2 
['a', 2, 3, 0, 9.0, 6, 'b'] 
Смежные вопросы