如前所述,运行是连续重复值的序列。实现一个名为longest_run的Python函数,该函数获取一个数字列表并返回最长运行时间的长度。例如,按顺序:
2, 7, 4, 4, 2, 5, 2, 5, 10, 12, 5, 5, 5, 5, 6, 20, 1
最长的运行长度为4
。然后,在主程序中,程序应要求用户输入列表,然后应调用longest_run函数并打印结果。
这是我尝试过的方法,但只返回1,我不明白为什么。我无法为此问题导入任何模块。
def longest_run(aList):
'''(list)->int
Returns length of the longest run
Precondition: aList is a list of a len of at least 2 and elements of list are ints
'''
count=0
bucket=[]
for i in aList:
if bucket==i:
count=count+1
else:
bucket=i
count=1
return count
答案 0 :(得分:0)
因此,您要尝试在列表中查找最长的相同数字?因为有点令人困惑,所以您尝试编写的代码。
您应该保留两个版本的计数:maxCount
(您将要返回的那个)和actualCount
(您将要递增的一个),遍历列表并将数字与下一个。如果相同,则actualCount += 1
,如果相同,则actualCount = 0
在每次迭代结束时,比较maxCount
和actualCount
,并且如果actualCount
大于{{1} }。
maxCount = actualCount
答案 1 :(得分:0)
您的代码最大的错误是设置bucket=[]
(这是一个列表),然后再设置为整数。
此外,您需要存储最长的序列和当前序列的长度(初始化为1)以及最后看到的值,因此存储的变量比存储的更多。
每个时间值与以前相同,增加计数器。如果不同,请在检查计数值是否不超过最大值后复位计数器。最后,以防万一最长的序列(经典错误)再次执行最大测试
像这样:
seq = [2, 7, 4, 4, 2, 5, 2, 5, 10, 12, 5, 5, 5, 5, 6, 20, 1]
result=1
max_result=0
last_seen=seq[0]
for v in seq[1:]:
if v==last_seen:
result += 1
else:
if result > max_result:
max_result = result
last_seen = v
result = 1
# just in case the longest sequence would be at the end of your list...
if result > max_result:
max_result = result
print(max_result)
当最终允许使用python电池时,请使用itertools.groupby
并计算序列长度的最大值:
max(sum(1 for x in v) for _,v in itertools.groupby(seq))
答案 2 :(得分:0)
由于循环在最后一次迭代中,因此您获得1
:
bucket = 20
和i = 1
的意思是bucket
!= i
,因此循环进入else子句并分配count = 1
退出,函数返回的计数为1。 / p>
建议:
1)当您遇到这样的错误时,请尝试手动运行代码/逻辑-这会有所帮助。
2)特别是对于这个问题-每当运行结束时,您都会忘记最后的运行长度,请考虑如何“记住”最长的运行。
答案 3 :(得分:0)
您可以使用以下方法:(每个数字的重复次数)
mylist = [2, 7, 4, 4, 2, 5, 2, 5, 10, 12, 5, 5, 5, 5, 6, 20, 1]
my_dict = {i:mylist.count(i) for i in mylist}
mylist = list(dict.fromkeys(mylist))
R_list=[]
for i in mylist:
print("%s repeated %s" %(i,my_dict[i]))
R_list = R_list+[my_dict[i]]
print(R_list)
print(max(R_list))