Home > Software engineering >  How to remove matching item from nested list?
How to remove matching item from nested list?

Time:04-13

I have a list with lists and I would like remove a wildcard matching item from each list if present, otherwise return it as it is.

Example

nested_list = [["abc","fds","gfssdf"],["dfsdf","cds","dvc"],["dsaf","abcvs","ewq"],...]

What I tried to do is:

for x in nested_list :
    for y in x:
        if re.search('abc. ', y) in x:
            nested_list.remove(x)

However it returns the same list, without any changes

My desirable output would be:

nested_list = [["fds","gfssdf"],["dfsdf","cds","dvc"],["dsaf","ewq"],...]

Is there a solution?

CodePudding user response:

Here is one way to do this with a nested 2D list comprehension:

nested_list = [["abc","fds","gfssdf"],["dfsdf","cds","dvc"],["dsaf","abcvs","ewq"]]
output = [[y for y in x if not re.search(r'^abc', y)] for x in nested_list]
print(output)  # [['fds', 'gfssdf'], ['dfsdf', 'cds', 'dvc'], ['dsaf', 'ewq']]

CodePudding user response:

You could also do this using startswith instead of re:

>>> [[y for y in x if not y.startswith("abc")] for x in nested_list]
[['fds', 'gfssdf'], ['dfsdf', 'cds', 'dvc'], ['dsaf', 'ewq']]

CodePudding user response:

The other answers are providing a nice solution, but I wanted to answer OP's original question for learning purposes


There are some mistakes in your code, I'll adress them one by one:

  1. if re.search('abc. ', y) in x:
    re.search returns None if it's not found, so you can remove the in x

  2. The in abc. searched for 1 or more, since you want to match abc, change the to a ? to match 0 or more

  3. If you'd remove all the elements from an deeper list, you'll end op with a empty list, so lets add a check for that and remove the empty list:

    if not x:
        nested_list.remove(x)
    

Applying those fixes gives us:

import re

nested_list = [["abc","fds","gfssdf"],["dfsdf","cds","dvc"],["dsaf","abcvs","ewq"], ["abc"]]

for x in nested_list :
    for y in x:
        if re.search('abc.?', y):
            x.remove(y)
            if not x:
                nested_list.remove(x)

print(nested_list)

Witch gives the expected output:

[['fds', 'gfssdf'], ['dfsdf', 'cds', 'dvc'], ['dsaf', 'ewq']]

As you can test in this online demo.

  • Related