python列表中最长的连续重复序列

时间:2018-10-28 19:22:51

标签: python list

如前所述,运行是连续重复值的序列。实现一个名为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

4 个答案:

答案 0 :(得分:0)

因此,您要尝试在列表中查找最长的相同数字?因为有点令人困惑,所以您尝试编写的代码。

您应该保留两个版本的计数:maxCount(您将要返回的那个)和actualCount(您将要递增的一个),遍历列表并将数字与下一个。如果相同,则actualCount += 1,如果相同,则actualCount = 0在每次迭代结束时,比较maxCountactualCount,并且如果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)

由于循环在最后一次迭代中,因此您获得1bucket = 20i = 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))