import itertools as it
def find_ranges(lst, n=2):
"""Return ranges for `n` or more repeated values."""
groups = ((k, tuple(g)) for k, g in it.groupby(enumerate(lst), lambda x: x[-1]))
repeated = (idx_g for k, idx_g in groups if len(idx_g) >=n)
return ((sub[0][0], sub[-1][0]) for sub in repeated)
lst = [34,2,3,22,22,22,22,22,22,18,90,5,-55,-19,22,6,6,6,6,6,6,6,6,23,53,1,5,-42,82]
list(find_ranges(lst, 5))
# [(3, 8), (15, 22)]
# Return the start and (1-past-the-end) indices of the first instance of
# at least min_count copies of element value in container l
def find_repeat(value, min_count, l):
look_for = [value for _ in range(min_count)]
for i in range(len(l)):
count = 0
while l[i + count] == value:
count += 1
if count >= min_count:
return i, i + count
6条答案
按热度按时间at0kjp5o1#
使用
np.diff
和@WarrenWeckesser给出的here方法在数组中查找零的游程:字符串
然后可以根据运行开始和结束之间的差异进行过滤:
型
bf1o4zei2#
下面是一个使用Python原生
itertools
的解决方案。代码
字符串
测试
型
本例捕获
lst
中的(index,element)对,然后按元素对它们进行分组。只保留重复的对。最后,对第一个和最后一个对进行切片,从每个重复的组中生成(start,end)索引。另请参阅this post以使用
itertools.groupby
查找索引范围。laawzig23#
其实并没有什么捷径可走。你可以这样做:
字符串
我将未找到的异常和较长的序列检测留给您。
4xrmg8kj4#
如果你要在列表
L
中查找value
重复n
次,你可以这样做:字符串
mxg2im7a5#
这里有一个相对快速,无误的解决方案,它还告诉你有多少个副本在运行中。
字符串
cidc1ykv6#
我有一个类似的要求。这是我提出的,只使用理解列表:
字符串
查找unique并返回其索引
型
np.unique对数组进行排序,对索引进行排序以获得原始顺序的索引
型
ind
包含重复组中第一个元素的索引,通过非连续索引可见它们的diff
给出了组中元素的数量。使用np.diff(ind)>5
过滤将给出一个布尔数组,其中True
位于组的起始索引处。ind
数组包含过滤列表中每个True
之后的每个组的结束索引创建一个dict,其中键作为重复元素,值作为该组的开始和结束索引的元组
型