Ответ 1
Используйте isinstance
:
if isinstance(e, list):
Если вы хотите проверить, что объект является списком или кортежем, передайте несколько классов в isinstance
:
if isinstance(e, (list, tuple)):
Если у нас есть следующий список:
list = ['UMM', 'Uma', ['Ulaster','Ulter']]
Если мне нужно выяснить, является ли элемент в списке самим списком, что я могу заменить aValidList в следующем коде на?
for e in list:
if e == aValidList:
return True
Есть ли специальный импорт для использования? Есть ли лучший способ проверить, является ли переменная/элемент списком?
Используйте isinstance
:
if isinstance(e, list):
Если вы хотите проверить, что объект является списком или кортежем, передайте несколько классов в isinstance
:
if isinstance(e, (list, tuple)):
Определите, какие свойства list
вы хотите, чтобы элементы имели. Нужно ли им индексировать? Sliceable? Нужен ли им метод .append()
?
Посмотрите абстрактный базовый класс, который описывает этот конкретный тип в collections
.
Используйте isinstance
:
isinstance(x, collections.MutableSequence)
Вы можете спросить: "Почему бы просто не использовать type(x) == list
?" Вы не должны этого делать, потому что тогда вы не будете поддерживать то, что похоже на списки. И часть менталитета Python утиная печать:
Я вижу птицу, которая ходит как утка и плавает, как утка и шарлатанцы, как утка, я называю эту птицу утки
Другими словами, вы не должны требовать, чтобы объекты были list
s, только что у них есть методы, которые вам понадобятся. Модуль collections
предоставляет кучу абстрактных базовых классов, которые немного похожи на интерфейсы Java. Любой тип, который является экземпляром collections.Sequence
, например, будет поддерживать индексирование.
Выражение, которое вы ищете, может быть:
...
return any( isinstance(e, list) for e in my_list )
Тестирование:
>>> my_list = [1,2]
>>> any( isinstance(e, list) for e in my_list )
False
>>> my_list = [1,2, [3,4,5]]
>>> any( isinstance(e, list) for e in my_list )
True
>>>