faceoff
faceoff

Reputation: 901

Find and delete list elements if matching a string

I have a list of strings stringlist = ["elementOne" , "elementTwo" , "elementThree"] and I would like to search for elements that contain the "Two" string and delete that from the list so my list will become stringlist = ["elementOne" , "elementThree"]

I managed to print them but don't really know how to delete completely from the list using del because i don't know the index or by using stringlist.remove("elementTwo") because I don't know the exact string of the element containing "Two"

My code so far:

for x in stringlist:
   if "Two" in x:
       print(x)

Upvotes: 6

Views: 19315

Answers (7)

dataninsight
dataninsight

Reputation: 1343

if you want to check for multiple string and delete if detected from list of string use following method

List_of_string = [ "easyapplyone", "appliedtwotime", "approachednone", "seenthreetime", "oneseen", "twoapproached"]

q = ["one","three"]

List_of_string[:] = [x for x in List_of_string if any(xs not in x for xs in q)]
print(List_of_string)

output:[ "approachednone", "seenthreetime"]

Upvotes: 0

Subham
Subham

Reputation: 411

print(list(filter(lambda x: "Two" not in x, ["elementOne" , "elementTwo" , "elementThree", "elementTwo"])))

Using lambda, if you are only looking to print.

Upvotes: 0

Subham
Subham

Reputation: 411

Using regex,

import re

txt = ["SpainTwo", "StringOne"]
for i in txt:
    x = re.search(r"Two", i)
    if x:
        temp_list = temp_list + [x.string] if "temp_list" in locals() else [x.string] 

print(temp_list)

gives

['SpainTwo']

Upvotes: 0

Rahul Gupta
Rahul Gupta

Reputation: 47846

Normally when we perform list comprehension, we build a new list and assign it the same name as the old list. Though this will get the desired result, but this will not remove the old list in place.

To make sure the reference remains the same, you must use this:

>>> stringlist[:] = [x for x in stringlist if "Two" not in x]
>>> stringlist
['elementOne', 'elementThree']

Advantages:
Since it is assigning to a list slice, it will replace the contents with the same Python list object, so the reference remains the same, thereby preventing some bugs if it is being referenced elsewhere.

If you do this below, you will lose the reference to the original list.

>>> stringlist = [x for x in stringlist if "Two" not in x]
>>> stringlist
['elementOne', 'elementThree']

So to preserve the reference, you build the list object and assign it the list slice.

To understand the subtle difference:

Let us take a list a1 containing some elements and assign list a2 equal to a1.

>>> a1 = [1,2,3,4]
>>> a2 = a1

Approach-1:

>>> a1 = [x for x in a1 if x<2]

>>> a1
[1]
>>> a2
[1,2,3,4]

Approach-2:

>>> a1[:] = [x for x in a1 if x<2]

>>> a1
[1]
>>> a2
[1]

Approach-2 actually replaces the contents of the original a1 list whereas Approach-1 does not.

Upvotes: 14

user3928919
user3928919

Reputation:

Doing this will help you

for i,x in enumerate(stringlist):
    if "Two" in x:
        del stringlist[i]

or

newList = []
for x in stringlist:
    if "Two" in x:
        continue
    else
        newList.append(x)

Upvotes: 0

Kasravnd
Kasravnd

Reputation: 107287

You can use enumerate to get the index when you iterate over your list (but Note that this is not a pythonic and safe way to modify your list while iterating over it):

>>> for i,x in enumerate(stringlist):
...    if "Two" in x:
...        print(x)
...        del stringlist[i]
... 
elementTwo
>>> stringlist
['elementOne', 'elementThree']

But as a more elegant and pythonic way you can use a list comprehension to preserve the elements that doesn't contains Two :

>>> stringlist = [i for i in stringlist if not "Two" in i]
>>> stringlist
['elementOne', 'elementThree']

Upvotes: 2

faceoff
faceoff

Reputation: 901

Well this was pretty simple - sorry for all the trouble

for x in stringlist:
   if "Two" in x:
      stringlist.remove(x)

Upvotes: -1

Related Questions