Python将对象数组加入对象

时间:2016-10-04 15:01:39

标签: python

我有一个对象类型为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)

这给了我一个错误,因为列表索引必须是整数。 有什么帮助吗?

谢谢!

5 个答案:

答案 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,其返回enumeratetuple。 另外,为什么使用(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)