2010-08-25 12 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'] 

Ici vous pouvez voir la liste l2 tombe avec une séquence différente, alors l'origine l1, je dois supprimer les doublons de ma liste sans modifier la séquence/ordre des éléments de la liste ....comment puis-je maintenir la séquence de ma liste en utilisant set?

+0

@carl - Hein? Cette question implique des doublons dans une liste de listes. Ceci est juste une liste, mais il veut le rendre unique sans se débarrasser de son ordre interne ... – Stephen

+2

"comment puis-je maintenir la séquence de ma liste en utilisant ensemble?" Les ensembles sont ** non ordonnés ** par définition – NullUserException

+0

@advait Concernant ma réponse - Merci, honnêtement, je ne savais pas si ça tiendrait ou non. Il était six heures du matin, donc je n'avais pas vraiment envie de démarrer Python. Tenté de changer la réponse pour utiliser des dictionnaires ordonnés, mais je ne suis pas trop familier avec eux, donc je vais juste supprimer la réponse, je pense. – Stephen

Répondre

0
Ce

est du haut de ma tête (à l'aide 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: l'utilisation des ensembles (également du haut de ma tête):

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

Si vous n'êtes pas concerné avec efficacité, ceci est O (n * m)

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

Utilisation d'une dict intermédiaire est plus compliqué, mais est O (n + m * logm)

où n est le nombre d'éléments dans l1 et m est le nombre d'éléments uniques dans 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'] 

en python3.1 vous avez OrderedDict il est donc très facile

>>> 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 pour le problème de la complexité @ John La Rooy – Ankush

5

Vous pouvez le résoudre en définissant une fonction comme ceci:

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

Pour l'utiliser:

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