【发布时间】:2019-08-17 12:12:17
【问题描述】:
给我一个清单:
[1 , 0 , 4 , 4 , 4 , 4 , 4 , 1]
我想编写一个程序来检查我的列表中是否存在一个连续出现 5 次的数字(数字可能因用户输入而异)并返回该数字。
在这种情况下,输出应该是 4。
Python 中是否有任何预定义的函数可以解决此类问题?
【问题讨论】:
给我一个清单:
[1 , 0 , 4 , 4 , 4 , 4 , 4 , 1]
我想编写一个程序来检查我的列表中是否存在一个连续出现 5 次的数字(数字可能因用户输入而异)并返回该数字。
在这种情况下,输出应该是 4。
Python 中是否有任何预定义的函数可以解决此类问题?
【问题讨论】:
你可以像这样使用itertools.groupby():
from itertools import groupby
lst = [1 , 0 , 4 , 4 , 4 , 4 , 4 , 1]
for number, sublist in groupby(lst):
if len(list(sublist)) == 5:
print(number)
默认情况下,groupby() 根据相等性对连续元素进行分组,因此它非常适合您(否则,可以提供 key 参数)。
在遍历lst 时,groupby() 函数将构造一个新的子列表并用所有彼此相等的连续值填充它。如果迭代值与前一个不同,groupby() 将产生 number 并填充相应的 sublist。即:(1, [1])、(0, [0])、(4, [4, 4, 4, 4, 4]),最后是(1, [1])。因此,您只需检查产生的sublist 的len() 以验证它是否包含足够的元素。请注意,这些实际上不是“列表”,而是“可迭代”,因此需要调用 list()。
【讨论】:
试试这个列表理解:
print([v for i, v in enumerate(lst, 1) if {v} == set(lst[i:i+4])])
输出:
[4]
【讨论】:
[-1, -1, -1, -1, -1] 上失败。 OP 说的是“数字”,而不是整数 >= 0。enumerate 方法不够通用。
y=list(set([x[i-1] for i in range(n-1, len(x)) if x[i-n:i]==[x[i-n]]*n]))
在哪里
n - 您正在寻找的连续出现次数
x - 您输入的列表
y - 连续出现 n 次的元素列表
【讨论】:
Sliding window 这个问题。
def checkList(listi, num):
k = [listi[0]]
nk = 0
listo = []
for v in listi[1:]:
if v == k[-1]:
k.append(v)
else:
if len(k) == num:
listo.append(k[-1])
k = [v]
if len(k) == num:
listo.append(k[-1])
return listo
l = [1 , 0 , 4 , 4 ,4, 4 , 4 , 1]
print(checkList(l, 5))
【讨论】: