Найдите последовательность элементов в массиве — python

#python #iteration #counter

Вопрос:

У меня здесь есть список:

 a = [1, 1, 0.5, 0.5, 0.25, 0.25, 0.25, 0.25,1,0.25,0.25].
 

В списке a я хочу распечатать

1 : [0,1]

0.5 : [2,3]

0.25 : [4,5,6,7]

1 : [8,8]

0.25 : [9,10]

Что я пробовал, так это:

 import numpy as np
a = [1, 1, 0.5, 0.5, 0.25, 0.25, 0.25, 0.25,1,0.25,0.25]

b = np.array(a).reshape(1,len(a))

x = [1,0.5,0.25]

for v in x:

    c = b - v
    indices = []


##    for i in range(len(c[0])):
##        if c[0,i] == 0.:
##            indices.append(i)
##    print(v,indices)

    i = 0
    
    while i  < len(c[0]):
        if c[0,i] == 0.:
            indices.append(i)
        i = i   1
        if len(indices) > 1 and indices[-1] != (indices[-2] 1): #len(indices) > 2 and 
            #i = i - 1
            indices = indices[:-1]
            print(i,v,indices)
            indices = []
            
        if len(indices) > 1 and i != (indices[-1] 1):
            print(i,v,indices)
            indices = []
 

Но результат был:

1 [0, 1]

0.5 [2, 3]

0.25 [4, 5, 6, 7]

Вы можете мне помочь?

Ответ №1:

Вы можете записать это как отличную функцию генератора, которая отслеживает значение и индексы текущего запуска:

 def find_runs(a):
    if not a:
        return
    curr_run = None
    for i, v in enumerate(a):
        if not curr_run:
            curr_run = (v, [i])
        elif v == curr_run[0]:
            curr_run[1].append(i)
        else:
            yield curr_run
            curr_run = (v, [i])
    yield curr_run


for val, indexes in find_runs([1, 1, 0.5, 0.5, 0.25, 0.25, 0.25, 0.25, 1, 0.25, 0.25]):
    print(val, indexes)
 

Результат таков

 1 [0, 1]
0.5 [2, 3]
0.25 [4, 5, 6, 7]
1 [8]
0.25 [9, 10]
 

Ответ №2:

Этот код также работает: (Я нашел себе ответ после того, как @AKX дал правильное решение)

 import numpy as np
from more_itertools import consecutive_groups
a = [1, 1, 0.5, 0.5, 0.25, 0.25, 0.25, 0.25,1,0.25,0.25]

b = np.array(a).reshape(1,len(a))

x = [1,0.5,0.25]

for v in x:


    d = np.where(b[0] == v)

    for group in consecutive_groups(d[0].tolist()):
        print(v,list(group))