Ошибка имени в Python, а также что такое ошибка отступа в Python? - PullRequest
1 голос
/ 29 октября 2011
movies=["the holy grail",1975,"terry jones & Terry gilliam",91,
    ["gilliam chapman",["michael palin","john cleese","terry gilliam","eric idle","terry jones"]]]

for each_item in movies:
 if isinstance(each_item , list):
    for nested_item in each_item:
            if isinstance(nested_item , list):
                    for each_d in nested_item:
                            print(each_d)
 else:
    print(nested_item)
else:
    print(each_item)

когда я запускаю этот код в IDLE, возникает ошибка: -

Traceback (последний вызов был последним): Файл "C: \ Users \ sumit \ Desktop \ 3d_array.py", строка 12, в печать (nested_item) NameError: имя 'nested_item' не определено

Я не знаю, почему возникает эта ошибка, а также до того, как появилась ошибка отступа, и когда я удалил эту ошибку, синтаксическая ошибка пришла для «else:». Это неправильная система else? Ребята, пожалуйста, помогите мне. *

Ответы [ 4 ]

0 голосов
/ 29 октября 2011

Вот еще один способ сократить вложенный список до единого плоского списка, и он должен работать на всех уровнях:

def reduce_recursive(x, y):
    if isinstance(y, list):
        return x+reduce(reduce_recursive, y, [])
    return x+[y]

for item in reduce(reduce_recursive, movies, []):
    print item
0 голосов
/ 29 октября 2011

Я не могу сказать, как у вас есть отступ с вашего поста, но я думаю, что неправильный отступ является проблемой, так как работает следующий код:

movies=["the holy grail",1975,"terry jones & Terry gilliam",91, ["gilliam chapman",["michael palin","john cleese","terry gilliam","eric idle","terry jones"]]]

for each_item in movies:
  if isinstance(each_item , list):
    for nested_item in each_item:
      if isinstance(nested_item , list):
        for each_d in nested_item: print(each_d)
      else: print(nested_item)
  else: print(each_item)
0 голосов
/ 29 октября 2011

Попробуйте заменить все ваши вкладки (если они есть) пробелами.Это сделает отступ более ясным.

0 голосов
/ 29 октября 2011

Вам нужно будет лучше отформатировать свой пример, и вы, вероятно, решите свою проблему в процессе.Поскольку else: может следовать как if, так и 'for`, этот код может интерпретироваться по-разному в зависимости от того, как он отступает.

for each_item in movies: 
    if isinstance(each_item , list): 
        for nested_item in each_item: 
            if isinstance(nested_item , list): 
                for each_d in nested_item: 
                    print(each_d) 
            else: 
                print(nested_item) 
    else: 
        print(each_item)

против:

for each_item in movies: 
    if isinstance(each_item , list): 
        for nested_item in each_item: 
            if isinstance(nested_item , list): 
                for each_d in nested_item: 
                    print(each_d) 
                else: 
                    print(nested_item) 
        else: 
            print(each_item)

ТамЕсть и другие возможности.Оба из них работают для меня и дают разные результаты.

Между тем, если я понимаю ваше намерение, вы, вероятно, захотите сделать что-то вроде следующего:

def iterate_recursive(l):
    for item in l:
        if isinstance(item, list):
            for nested_item in iterate_recursive(item):
                yield nested_item
        else:
            yield item

for item in iterate_recursive(movies):
    print item

Какие выходные данные:

the holy grail
1975
terry jones & Terry gilliam
91
gilliam chapman
michael palin
john cleese
terry gilliam
eric idle
terry jones
...