Как я могу поддерживать последовательность моего списка с помощью набора? - PullRequest
4 голосов
/ 25 августа 2010
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, мне нужно удалить дубликаты элементов из моего списка без изменения последовательности / порядка элементов списка ....

Ответы [ 3 ]

11 голосов
/ 25 августа 2010

Если вас не интересует эффективность, это O (n * m)

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

Использование промежуточного диктанта более сложное, но O (n + m * logm)

где n - количество элементов в l1, а m - количество уникальных элементов в 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']
5 голосов
/ 07 ноября 2013

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

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']
0 голосов
/ 25 августа 2010

Это от макушки моей головы (используя дикты):

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']

Редактировать: Используя наборы (также от макушки головы):

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)
...