Search code examples
pythonpython-3.xlist-comprehensionpython-itertools

How to delete n elements from an array of two nested lists without losing the array?


I am working with a nested structure like this:

l=[

[['apple', 'bannana', 'pear', 'watermelon'], ['watermelon', 'pear', 'bannana', 'grapes']],
[['apple', 'bannana', 'pear', 'watermelon'], ['watermelon', 'pear', 'strawberry', 'strawberry', 'strawberry', 'apricot', avocado]],
[['apple', 'bannana', 'pear', 'watermelon'], ['watermelon', 'pear', 'strawberry', 'strawberry', 'strawberry', 'tomato']],
[['apple', 'bannana', 'pear', 'watermelon'], ['watermelon','pear','strawberry', 'strawberry', 'strawberry', 'strawberry', 'strawberry', 'strawberry', 'apricot', 2]]

 ]

How can I preserve an arbitrary number of elements from each element (sublist) of two nested lists? For example, say I want to preserve at least 5 elements. The expected output should be:

 ]

    [['apple', 'bannana', 'pear', 'watermelon'], ['watermelon']],
    [['apple', 'bannana', 'pear', 'watermelon'], ['watermelon']],
    [['apple', 'bannana', 'pear', 'watermelon'], ['watermelon']],
    [['apple', 'bannana', 'pear', 'watermelon'], ['watermelon']]

 ]

Or 9:

[

[['apple', 'bannana', 'pear', 'watermelon'], ['watermelon', 'pear', 'bannana', 'grapes']],
[['apple', 'bannana', 'pear', 'watermelon'], ['watermelon', 'pear', 'strawberry', 'strawberry']],
[['apple', 'bannana', 'pear', 'watermelon'], ['watermelon', 'pear', 'strawberry', 'strawberry']],
[['apple', 'bannana', 'pear', 'watermelon'], ['watermelon','pear','strawberry', 'strawberry', 'strawberry']]

]

Or 11:

[

[['apple', 'bannana', 'pear', 'watermelon'], ['watermelon', 'pear', 'bannana', 'grapes']],
[['apple', 'bannana', 'pear', 'watermelon'], ['watermelon', 'pear', 'strawberry', 'strawberry', 'strawberry', 'apricot', avocado]],
[['apple', 'bannana', 'pear', 'watermelon'], ['watermelon', 'pear', 'strawberry', 'strawberry', 'strawberry', 'tomato']],
[['apple', 'bannana', 'pear', 'watermelon'], ['watermelon','pear','strawberry', 'strawberry', 'strawberry', 'strawberry', 'strawberry']]

]

Alternatively, consider this list:

l2 = [

[['apple'], ['watermelon']],
[['apple', 'bannana', 'pear', 'watermelon'], ['watermelon', 'pear', 'strawberry', 'strawberry', 'strawberry', 'apricot', avocado]],
[['apple', 'bannana', 'pear', 'watermelon'], ['watermelon', 'pear', 'strawberry', 'strawberry', 'strawberry', 'tomato']],
[['apple', 'tomato'], ['watermelon','pear','strawberry', 'strawberry', 'strawberry', 'strawberry', 'strawberry', 'strawberry', 'apricot', 2]]

]

If I want 4, the output should look like this:

[

[['apple'], ['watermelon']],
[['apple', 'bannana', 'pear', 'watermelon'],[]],
[['apple', 'bannana', 'pear', 'watermelon'],[]],
[['apple', 'tomato'], ['watermelon','pear']]

]

I could iterate and join over each sublist. However, If I do that I might break the inner lists inside the list. Any idea of how to remove a number elements without losing the [[],[]] structure efficiently?


Solution

  • Using for loop:

    res = []
    n = 4
    for li, lj in l2:
        res.append([li[:n], lj[:max(0,n-len(li))]])
    res
    

    Output:

    [[['apple'], ['watermelon']],
     [['apple', 'bannana', 'pear', 'watermelon'], []],
     [['apple', 'bannana', 'pear', 'watermelon'], []],
     [['apple', 'tomato'], ['watermelon', 'pear']]]
    

    With l and n=5:

    res = []
    n = 5
    for li, lj in l:
        res.append([li[:n], lj[:max(0,n-len(li))]])
    res
    

    Output:

    [[['apple', 'bannana', 'pear', 'watermelon'], ['watermelon']],
     [['apple', 'bannana', 'pear', 'watermelon'], ['watermelon']],
     [['apple', 'bannana', 'pear', 'watermelon'], ['watermelon']],
     [['apple', 'bannana', 'pear', 'watermelon'], ['watermelon']]]