Python 2.6: попытка запустить оператор if, если переменная является списком

Я новичок в 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)

При использовании is instance вам не нужен type()

adir abargil 14.12.2020 23:26

Если вы новичок в Python, не начинайте с Python 2.6. Python 2 подошел к концу в прошлом году. Используйте обновленную версию, например 3.8 или 3.9.

Wombatz 14.12.2020 23:27
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
243
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Существует несколько способов проверки списка. Попытка использовать их все сразу действительно сбивает с толку и не нужна, особенно для того, чтобы задать вопрос на форуме, подобном этому. Я бы рекомендовал использовать 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.

Другие вопросы по теме