我试图通过循环遍历我的列表并且计数器= 0来找到这个函数,并且当找到0时计数器+ = 1并且当找到第一个非0时,将开始新的计数器并且列表中的下一个0会添加到新的计数器等。然而,这不是我的教授想要这个计算的方式,但正如我之前提到的,我错过了一个类,我正在努力理解如何使用flags / boolean代替
我的计划必须:
我的教授希望我们“合并标志和布尔数据类型。使用循环遍历列表,一旦找到0,将标志设置为true并使用计数器递增。使用一个列表,稍后您可以附加计数器每次爆发“
让我们说: N = 15 burstList = [1,0,0,0,0,3,7,0,0,0,0,0,0,0,0]
然后我的列表burstLengths应该包含: [4,6,1]
到目前为止我只有:
burstList = []
N = int(input("Enter the length of the list: "))
def listSize():
>for i in range(N):
>>value = int(input("Enter integer value "+str(i+1)+": "))
>>burstList.append(value)
>print("List = ", burstList)
您的作业将占用大约10-20行代码。简而言之,您期望做的是:
counter
和flag
。 counter
将计数爆发,flag
会让你知道什么时候计算。x
中的每个数字burstList
,
检查x
是否为0.如果是,请将flag
设置为True
并增加你的counter
。
如果x
不等于零,那么检查flag
是否仍然是True
。如果是,那意味着你需要在counter
中保存burstLengths
的当前值,重置它,并将flag
设置为False
。最后,你需要注意这样一个事实:在迭代之后,你可能没有注册最后一个爆发,如果有的话(例如,如果k
的最后一个burstList
元素是0)。所以你必须处理它。
由于这是一项任务,这里是使用您无法上交的代码的解决方案,仅用于演示:-)
import pandas as pd
v = pd.Series(burstList).eq(0)
_, burstLengths = pd.np.unique(
v.ne(v.shift()).cumsum().where(v).dropna(), return_counts=True)
print(burstLengths.tolist())
[4, 6, 1]
或者,如果你想要一些想法,这里有一些初学者代码,缺少必要的部分:
counter = 0
flag = False
burstLengths = []
for i in burstList:
if i == 0:
???
else:
???
if flag:
???
解决您问题的另一种方法如下:
1)获取输入列表的长度并初始化输出列表,计数连续0的数量的计数器值和找到0时要设置的标志变量。
2)对于列表中的每个元素:
3)最后,返回输出列表。
下面的代码实现了上述算法:
def burstLength(burstList):
counter = 0
output = []
length = len(burstList)
foundZero = False
for i in range(length):
if burstList[i]==0:
if i==length-1:
output.append(1)
else:
counter += 1
foundZero = True
else:
if foundZero:
output.append(counter)
counter = 0
foundZero = False
return output
运行它:
N=15
burstList=[1, 0, 0, 0, 0, 3, 7, 0, 0, 0, 0, 0, 0, 5, 0]
print(burstLength(burstList))
给您以下结果:
[4, 6, 1]