Я новичок в python и пытаюсь выполнить упражнение, в котором я печатаю каждую переменную из списка, включая любые вложенные списки.
Моя проблема в том, что я не могу заставить вложенные списки распознаваться как списки с помощью оператора if.
Когда я запускаю тип (i), он возвращает, что это список, однако, когда я запускаю if type(i) is list
или if type(i) == list
, он не выполняется.
Когда я попытался использовать if isinstance(type(i), list)
, я получил TypeError:isinstance() arg 2 must be a class, type, or tuple of classes and types.
Когда я попробовал isinstance(type(i),collections.Sequence)
, вложенный список также не распознается как список.
Если у кого-то есть какие-либо советы, это будет оценено. Я использую Python 2.6, так как прохожу курс MIT.
Спасибо
# -*- coding: cp1252 -*-
import collections
listval= ["war",1,["brie","rocky","roq le coq"],[1,2,3]]
def printlist2(lists):
for i in lists:
print("Variable value: ", type(i))
print ("Is variable a list: ",isinstance(type(i),collections.Sequence))
#print (isinstance(type(i),list))
if isinstance(type(i),collections.Sequence):
print ("This is a list")
printlist2(i)
elif type(i) == list:
print ("This is a list")
elif type(i) is int:
#print ("String length is equal to ",len(str(i)))
print ("i is equal to integer ",i)
else:
#print ("String length is equal to ",len(i))
print ("i is equal to string ",i)
printlist2(listval)
Если вы новичок в Python, не начинайте с Python 2.6. Python 2 подошел к концу в прошлом году. Используйте обновленную версию, например 3.8 или 3.9.
Существует несколько способов проверки списка. Попытка использовать их все сразу действительно сбивает с толку и не нужна, особенно для того, чтобы задать вопрос на форуме, подобном этому. Я бы рекомендовал использовать isinstance
. Вы просто хотите протестировать сам объект, а не брать его type()
с помощью isinstance
Если вы используете этот тест или один из альтернативных методов, структура вашего кода работает нормально, и вы получаете ровно 2 списка, указанных во время выполнения. Ваши входные данные не очень хорошо демонстрируют рекурсию, но если вы добавите больше уровней встроенных списков, код справится с этим. Вот сильно упрощенная версия вашего кода, показывающая, что использование isinstance
действительно работает:
# -*- coding: cp1252 -*-
listval= ["war",1,["brie","rocky","roq le coq"],[1,2,3]]
def printlist2(lists):
for i in lists:
if isinstance(i, list):
print ("This is a list: " + str(i))
printlist2(i)
else:
print ("This is not a list: " + str(i))
printlist2(listval)
Результат:
This is not a list: war
This is not a list: 1
This is a list: ['brie', 'rocky', 'roq le coq']
This is not a list: brie
This is not a list: rocky
This is not a list: roq le coq
This is a list: [1, 2, 3]
This is not a list: 1
This is not a list: 2
This is not a list: 3
type(i) == list1
и type(i) is list
тоже подойдут. Просто выберите один. Этот код будет работать как с Python 2, так и с Python 3. Я согласен с @Wombatz — используйте последнюю версию Python 3.
При использовании is instance вам не нужен type()