gpt4 book ai didi

对象列表的 Python 迭代 "not iterable"

转载 作者:行者123 更新时间:2023-11-28 22:50:33 25 4
gpt4 key购买 nike

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>

Sooo 我实际上应该如何做我想做的事?我用 .iter 或 ___iter___ 尝试了几件事,但没有成功。

此外, if a._lineItems != [] 似乎也不起作用(也没有变化)。我得到打印的“无”行

最佳答案

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

关于对象列表的 Python 迭代 "not iterable",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22521739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com