尝试执行合计语句时,获取索引超出范围错误



我试图执行多个合计语句,但它总是说索引超出范围。这是代码部分:

for m in range(len(mo)):
for o in range(len(mag)):
if mag[o] == 0 and mo[m] ==1 :
countfujita[m] = countfujita[m] + 1

我正试图将总数放入列表中,列表如下:countfujita=[0,0,0,0,0]

我怀疑这是因为您正在为mo中的每个项循环mag,而这不是您想要的。如果以下修复了您的问题,请告诉我:

for m in range(len(mo)):
if mag[m] == 0 and mo[m] ==1 :
countfujita[m] = countfujita[m] + 1

(这假设len(mag) = len(mo)(

为了使代码成功运行,您需要确保countfujita至少是mo列表一样长。

以下是一种稳健的方法:

mo = [1, 0, 3]
mag = [3, 0, 1, 11]
# construct a list of the same length as *mo* and fill with zeroes
countfujita = [0] * len(mo)
for m in range(len(mo)):
for o in range(len(mag)):
if mag[o] == 0 and mo[m] == 1:
countfujita[m] += 1
print(countfujita)

输出:

[1, 0, 0]

在嵌套循环中索引多个列表很容易出错。一般来说,我们希望尽可能多地利用python内置模块。

例如(从Lancelot du Lac定义的例子开始(,我们可以使用itertools.product来生成momag的所有组合。enumerate给了我们对应于mo:元素的索引

from itertools import product
for (imo, xmo), xmag in product(enumerate(mo), mag):
if (xmo, xmag) == (1, 0):
countfujita[imo] += 1

为了进一步推动这一点,我们可以将其与Counter结合起来,首先生成所有mo索引的列表,然后进行计数。这会产生一个计数器对象Counter({0: 1})对象,类似于dict,它可能合适也可能不合适,这取决于您稍后对countfujita所做的操作:

from itertools import product
from collections import Counter
Counter([imo for (imo, xmo), xmag 
in product(enumerate(mo), mag) 
if (xmo, xmag) == (1, 0)])
# Counter({0: 1})

相关内容

  • 没有找到相关文章

最新更新