我刚接触Python,但已经研究了几个小时。如果我漏掉了一些显而易见的东西,请原谅。
我有一个名为LineItem的类,它有一个属性 _lineItems,是属于给定 LineItem 的 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>
我该如何实现我所要做的事情?我尝试了一些 .iter 或 ___iter___
的方法,但都没有成功。
另外,if a._lineItems != [] 似乎也无效(或其变体)。我得到打印的行是“None”。
!= []
,而应该使用if a._lineItems
或者if len(a._lintItems)
。另外,不想挑刺,但这并不是递归。 - sberry