我有一个对象类型为mini_carpet的列表(name = carpet)。 Mini_carpet包含一个名为packages的对象列表。 包有各种属性,我感兴趣的是nr_buys。
我想要做的是在地毯内总结mini_carpet内的各种nr_buys。 这是我到目前为止所做的:
for d in range(0, carpet.__len__() - 1, +1):
nr_total = sum(carpet[d].packages[i].nr_buys for i in carpet[d].packages)
这给了我一个错误,因为列表索引必须是整数。 有什么帮助吗?
谢谢!
答案 0 :(得分:2)
在Python中,通常最好直接循环遍历列表中的项目,而不是使用索引间接循环。它更容易阅读,更有效的是不用你真正不需要的索引。
要获得每个mini_carpet
的总计,您可以执行以下操作:
for mini in carpet:
nr_total = sum(package.nr_buys for package in mini)
# Do something with nr_total
要获得单个总计,请在生成器表达式中执行双for
循环:
nr_total = sum(package.nr_buys for mini in carpet for package in mini)
答案 1 :(得分:0)
for d in range(0, len(carpet) - 1, +1):
nr_total = sum(carpet[d].packages[i].nr_buys for i, _ in enumerate(carpet[d].packages))
您希望获得indexes
的{{1}},因此请使用dict
,其返回enumerate
:tuple
。
另外,为什么使用(index, item)
?
答案 2 :(得分:0)
另一种方法,我认为这更像是Pythonic,是:
nr_total = sum(package.nr_buys for package in carpet[d].packages)
如上所述,差异在于,在python中调用for x in list
会为您提供列表中的项目,而不是它们的索引。这意味着您的答案中的i
不是商品packages
中的整数索引,而是来自packages
本身的商品,您可以直接使用该商品。
现在可以从头开始:
nr_total = sum(package.nr_buys for mini_carpet in carpet for package in mini_carpet)
(不要问我为什么Python使用那个顺序,它也让我感到困惑,但这就是列表推导的工作方式。)
答案 3 :(得分:0)
汇总地毯内mini_carpet内的各种
nr_buys
除了其他人所说的关于尝试使用非整数对象索引列表之外,您还丢弃了先前迭代的结果。
您可以使用地图索引作为关键字来保存这些结果,以后可以用来访问该地毯中包裹的nr_buys
值总和的结果:
nr_total = {}
for i, c in enumerate(carpet):
nr_total[i] = sum(package.nr_buys for package in c.packages)
要获得所有地毯的总nr_buys
,您只需执行以下操作:
total = sum(nr_total.values())
答案 4 :(得分:-1)
如果您已编码__len__方法,则无需通过carpet.__len__()
调用它。而不是使用len(carpet)
。