Как проверить, какие типы данных в списке, независимо от того, насколько глубоко этот список - PullRequest
1 голос
/ 01 октября 2019

У меня есть список, который я хотел бы проверить, какие типы данных в нем, независимо от того, сколько уровней в списке. Сначала я подумал сделать это:

all([isinstance(x, (int, float, str, bytes, list, tuple, set, dict)) for x in l])

Но, похоже, это не работает:

>>> l = [1, 2, 3, 4, [bytearray(b'1234')]]
>>> all([isinstance(x, (int, float, str, bytes, list, tuple, set, dict)) for x in l])
True

Есть ли другой способ сделать это? Тот, который работает?

1 Ответ

2 голосов
/ 01 октября 2019

Вы можете использовать следующую функцию flatten:

def flatten(s):
    for e in s:
        if isinstance(e, (tuple, list)):
            yield from flatten(e)
        else:
            yield e

l = [1, 2, 3, 4, [bytearray(b'1234')]]

result = all(isinstance(x, (int, float, str, bytes, list, tuple, set, dict)) for x in flatten(l))
print(result)

Выход

False

Преимущество этого подхода заключается в том, что вам не нужно проверятьвесь список, all будет закорочен, если найдет False.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...