Question: ```
lista = [["a", "b", "c"], ["d", "e", "f"]]

def check(temp_plan):
    if all(isinstance(elements, str) for elements  in temp_plan):
        return True
    else:
        return False

print(check(lista))

```

I know the code above returns false since the elements in the list are lists.

Answer: 
If it's *consistently* a two-dimensional list, then you can use a second `for` in the comprehension inside `all()`:

```
def check(temp_plan):
    return all(
        isinstance(e, str)
        for elements in temp_plan
        for e in elements
    )

print(check(lista))
# True
# since `isinstance(e, str)` is true for each sub-element

```

(note I replace `if all(...): True; else False` with just `all()`, since `all()` returns a `True` or `False` answer anyway).

Your condition `isinstance(e, str)` can be whatever you want - your question title says you want to check if they're integers, and if that's the case you can change the condition to `e.isdigit()`, which returns `True` if the string represents an integer and `False` otherwise.
Here's a version that doesn't care about the internal structure. We can just check each element to see if it is str (return True), iterable (check all of its elements), else return False

```
from typing import Iterable

def check(data):
    if isinstance(data, str):
        return True # recursion base case
    if isinstance(data, Iterable):
        return all(map(check, data))
    return False

if not check('a'):
    raise ValueError
if check(0):
    raise ValueError

lista = [["a", "b", "c"], ["d", "e", "f"]]
listb = [["a", ["b", "c", 0]], [["d", "e"], "f"]]
if not check(lista):
    raise ValueError
if check(listb):
    raise ValueError

print ('passed')

```