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.
You are iterating the array `["a", "b", "c"]`, so `False` is no doubt the result when type-check with `str`

One solution is to flatten the n-dimensional array to 1-dimensional one and then check it (in the example I flatten the array using [`itertools.chain`](https://docs.python.org/3.8/library/itertools.html#itertools.chain))

```
import itertools

lista = [["a", "b", "c"], ["d", "e", "f"]]
listb = [[1, "b", "c"], ["d", "e", "f"]]

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

print(check(lista))
print(check(listb))

```