tags:

views:

106

answers:

5

I have list in python which has following entries

name-1

name-2

name-3

name-4

name-1

name-2

name-3

name-4

name-1

name-2

name-3

name-4

I would like remove name-1 from list except its first appearance -- resultant list should look like

name-1

name-2

name-3

name-4

name-2

name-3

name-4

name-2

name-3

name-4

How to achieve this ?

+1  A: 

Find the index of the first element you wish to remove, then filter the rest of the list. The following works in Python 2.5:

def removeAllButFirst(elem, myList):
    idx = myList.index(elem)
    return myList[0:idx+1] + filter(lambda x: x != elem, myList[idx+1:])
A. Levy
First three lines could be `idx = myList.index(elem)`
ChristopheD
Also `myList = myList[0:idx] + ...` should probably be `myList = myList[0:idx+1] + ...` (we need to include the first occurence of 'name1').
ChristopheD
Yeah, I just typed in the first thing that came to my head. I couldn't remember the method to find something in a list. I've tested the revised function above, and it does indeed work.
A. Levy
+2  A: 

Assuming name-1 denotes "the first element":

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

EDIT: If the overall goal is to de-duplicate the entire list, just use set(names).

Marcelo Cantos
thanks you for all. i'll solution should work.
lakshmipathi
+3  A: 
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)
THC4k
lst[:first+1] What does this mean?
kame
a slice from the beginning to the element first+1
fortran
+1  A: 
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']
Dave
+2  A: 

Based on Marcelo's solution:

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

systempuntoout