我试图执行多个合计语句,但它总是说索引超出范围。这是代码部分:
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
来生成mo
和mag
的所有组合。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})