Итерация на языке Python списка объектов «не повторяется»

Новое для Python, но я занимаюсь этим пару часов. Простите меня, если я пропущу что-то очевидное.

У меня есть класс под названием LineItem, который имеет атрибут _lineItems, список LineItems, принадлежащих данному LineItem. Под-список, в основном.

Я хочу распечатать LineItem и все его подпункты (и подтипы подэлементов), но у меня возникают проблемы с итерацией.

from decimal import * class LineItem(object): """ Instance attributes: amount: Decimal _lineItems: list of child internal lineitems (possibly an empty list) isInternal: bool """ def __init__(self, **kw): self.amount = Decimal(0) self._lineItems = [] self.isInternal = False for k, v in kw.items(): setattr(self, k, v) 

Пример LineItem, который дает мне проблемы, определяется ниже как ext2, с тремя детьми.

 # External line item with one level of children int1 = LineItem(amount=Decimal('1886.75'), description='State Dues', isInternal=True) int2 = LineItem(amount=Decimal('232.50'), description='National Dues', isInternal=True) int3 = LineItem(amount=Decimal('50'), description='Processing Fee', isInternal=True) ext2 = LineItem(amount=Decimal('2169.25'), description='Dues', _lineItems=[int1, int2, int3]) 

У меня есть эта рекурсивная функция для итерации всех подпозиций (и их пронумеровать, например 1, 2, 2.1 в качестве первого подпункта второго элемента и т. Д.),

 def print_line_item(LineItems): count = 1 for a in LineItems: print count, ' ', a.description, ' (', a.amount, ')' if a._lineItems != []: for b in a._lineItems: print count, '.', print_line_item(b), count+=1 

но когда я пытаюсь его использовать

 def main(): print_line_item([ext1, ext2, ext3]) #ext1 has no children, prints fine if __name__=="__main__": main() 

я получил

 line 56, in print_line_item print count, '.', print_line_item(b), line 51, in print_line_item for a in LineItems: TypeError: 'LineItem' object is not iterable 

Ладно, так почему-то я набираю списки.

если я добавлю пару заявлений печати:

 def print_line_item(LineItems): count = 1 for a in LineItems: print count, ' ', a.description, ' (', a.amount, ')' if a._lineItems != []: print a._lineItems for b in a._lineItems: print b print count, '.', print_line_item(b), count+=1 

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

 [<__main__.LineItem object at 0x0227C430>, <__main__.LineItem object at 0x0227C5F0>, <__main__.LineItem object at 0x0227C670>] 

и что b, я пытаюсь перейти к рекурсивному вызову, является адресом памяти одного LineItem

 <__main__.LineItem object at 0x0227C430> 

Sooo, как я на самом деле должен делать то, что я пытаюсь сделать? Я попробовал пару вещей с .iter или ___iter___ но не повезло.

Кроме того, если a._lineItems! = [], Похоже, не работает (или вариации на нем). Я получаю печатные строки «Нет»

2 Solutions collect form web for “Итерация на языке Python списка объектов «не повторяется»”

 def print_line_item(LineItems): count = 1 for a in LineItems: print count, ' ', a.description, ' (', a.amount, ')' if a._lineItems != []: for b in a._lineItems: print count, '.', print_line_item(b), count+=1 

Это может быть правильная версия, не проверенная.

 def print_line_item(LineItems, precedingNumber='1'): count = 1 for a in LineItems: print precedingNumber, '.', count, ' ', a.description, ' (', a.amount, ')' print_line_item(a._lineItems, precedingNumber + '.' + count), count+=1 

Имеет смысл, что вы получаете сообщение, не подлежащее повторению – вы по существу рекурсируете в print_line_item для каждого элемента в списке – и рано или поздно вы ударите что-то в списке, который не является итерируемым – и вы просто продолжаете и вызываете print_line_item () на нем, который будет пытаться перебирать его.

Если вы хотите спросить: «Этот элемент списка?» вы можете использовать isinstance(some-object, list) . Или, если вы хотите разрешить другие итерационные, но не-список-вещи, вы можете использовать if isinstance(some-object, collections.Iterable) (вам придется импортировать коллекции).

  • Есть ли способ эффективно получить каждый файл в каталоге, содержащем миллионы файлов?
  • Глубоко скопировать список в Python
  • локальные переменные «серверы», на которые ссылаются перед назначением
  • Чистый способ взять элементы из одного списка в другой
  • Как распечатать все возможности вложенных списков в python?
  • Удалить пунктуацию из списка
  • Список сортировки данных Python по алфавиту
  • Рандомизировать 2 списка для цикла for
  • Как передать список как вход функции в Python
  • Учет списка для извлечения списка кортежей из словаря
  • Разделение на последний разделитель в строке Python?
  •  
    Interesting Posts for Van-Lav

    Обфускационные струны с ASCII и базой 128

    При вызове баз метакласса объект .__ init __ () не принимает параметров

    Использование многопроцессорной обработки / потоковой обработки для прерывания работы массива numpy в кусках

    Почему словарь не является детерминированным?

    Project Euler 5 в Python – Как я могу оптимизировать свое решение?

    Относительный порядок элементов в списке

    Sklearn Randomized Logistic Regression дает ошибку «ValueError: количество классов должно быть больше одного»

    Python – сравнение даты и времени с использованием временных меток, timedelta

    Почему не обновляет пипс моего numpy и scipy?

    Написание и чтение одного и того же файла csv в Python

    Оптимальный способ вычисления парной взаимной информации с использованием numpy

    Win32api не дает правильные координаты с GetCursorPos () в python

    Преобразование Pandas SparseDataframe в Scipy sparse csc_matrix

    Создание никогда повторяющегося случайного шестнадцатеричного генератора

    Начало работы с Twitter \ OAuth2 \ Python

    Python - лучший язык программирования в мире.