2010-04-14 8 views
3

je liste en python qui suit entréesliste d'analyse en python

nom-1

nom-2

nom-3

nom-4

nom-1

nom-2

nom-3

nom-4

nom-1

nom-2

nom-3

nom-4

je voudrais comme supprimer le nom-1 de la liste, sauf son premier apparence - la liste résultante devrait ressembler à

nom-1

nom-2

nom-3

nom-4

nom-2

nom

-3

nom-4

nom-2

nom-3

nom-4

Comment y parvenir?

+0

Juste nom-1, ou tous les doublons? La préservation de l'ordre est-elle importante? Je suppose que c'est, mais le problème est beaucoup plus facile si ce n'est pas le cas. –

+0

le premier élément doit rester comme "nom-1" - autre que cet ordre des éléments restants n'est pas important. –

Répondre

2

nom-1 En supposant signifie "premier élément":

[names[0]] + [n for n in names[1:] if n != names[0]] 

EDIT: Si l'objectif global est de dé-dupliquer la liste entière, il suffit d'utiliser set(names).

+0

vous remercie pour tous. Je vais solution devrait fonctionner. –

1

Trouvez l'index du premier élément que vous souhaitez supprimer, puis filtrez le reste de la liste. Les travaux suivants en Python 2.5:

def removeAllButFirst(elem, myList): 
    idx = myList.index(elem) 
    return myList[0:idx+1] + filter(lambda x: x != elem, myList[idx+1:]) 
+0

Les trois premières lignes pourraient être 'idx = myList.index (elem)' – ChristopheD

+0

Aussi myList = myList [0: idx] + ... 'devrait probablement être' myList = myList [0: idx + 1] + ... '(nous devons inclure la première occurence de 'name1'). – ChristopheD

+0

Ouais, j'ai juste tapé la première chose qui m'est venue à l'esprit. Je ne me souviens pas de la méthode pour trouver quelque chose dans une liste. J'ai testé la fonction révisée ci-dessus, et cela fonctionne effectivement. –

3
def remove_but_first(lst, it): 
    first = lst.index(it) 
    # everything up to the first occurance of it, then the rest of the list without all it 
    return lst[:first+1] + [ x for x in lst[first:] if x != it ] 

s = [1,2,3,4,1,5,6] 
print remove_but_first(s, 1) 
+0

lst [: first + 1] Qu'est-ce que cela signifie? – kame

+2

une tranche du début à l'élément premier + 1 – fortran

1
mylist = ['name-1', 'name-2', 'name-3', 'name-4', 'name-1', 'name-2', 'name-3', 'name-4', 'name-1', 'name-2', 'name-3', 'name-4'] 
newlist = filter(lambda x: x != 'name-1', mylist) 
newlist.insert(mylist.index('name-1'), 'name-1') 
print newlist 
['name-1', 'name-2', 'name-3', 'name-4', 'name-2', 'name-3', 'name-4', 'name-2', 'name-3', 'name-4'] 
2

Basé sur la solution de Marcelo:

[name for cnt,name in enumerate(names) if (name != names[0] or cnt > 0)]