Estoy tratando de devolver elementos específicos en una lista basada en un patrón.

Si aparece el valor '04' y el valor inmediatamente después de ser '01', devuelva los siguientes 3 valores después, pero no '04' o '01'. Si aparece '04' y '01' no es posterior, puede ignorarse por completo

list = ['04','01','dd','dd','8a','04','2e', '04','01','dd','dd','8a']

for i in list:
    if '04' in list and list.index('04')+1 == '01':
        new_list = list.index('04')+2
        print (new_list) 

Traté de seguir los gustos de Encontrar el índice de un elemento en un list, pero no pude adaptarlo a mi problema.

Editar:

La lista es mucho más larga (más de 3000 elementos), y necesito devolver los siguientes 172 elementos después de '04' y '01', no 3. No debería haber usado eso como un ejemplo. Disculpas!

1
SachinReddy 23 jun. 2020 a las 16:42

3 respuestas

La mejor respuesta

Hola, descubrí una manera con la función enumerar:

lst = ['04','01','dd','dd','8a','04','2e', '04','01','dd','dd','8a']
n_elements = 172
result = []
for idx, item in enumerate(lst):
    if item == '04' and lst[idx+1] == '01' and (idx< len(lst) - n_elements):
        result.append(lst[idx+2:idx+2+n_elements ])

print(result)

Out[1]: [['dd', 'dd', '8a'], ['dd', 'dd', '8a']]

Avísame si te conviene :)

0
Saul Villamizar 23 jun. 2020 a las 14:47

Puede usar una lista de comprensión para hacer el trabajo:

lst = ['04','01','dd','dd','8a','04','2e', '04','01','dd','dd','8a']

new_lst = [z for x, y, *z in zip(lst, lst[1:], lst[2:], lst[3:], lst[4:]) if x == '04' and y == '01']

Que produce:

[['dd', 'dd', '8a'], ['dd', 'dd', '8a']]

Como nota al margen index() en la lista devuelve el primer índice de la lista. Por lo tanto, su método no funcionará para múltiples ocurrencias.

Evite nombrar la variable como list, es una función incorporada.

0
Austin 23 jun. 2020 a las 13:48

Aquí hay una forma de usar generadores:

from itertools import islice

l = ['04','01','dd','dd','8a','04','2e', '04','01','dd','dd','8a']

next_n = 3
l_i = iter(l)
out = []
for i in l_i:
    if i=='04':
        if next(l_i)=='01':
            out.append(list(islice(l_i, 0, next_n)))

print(out)
# [['dd', 'dd', '8a'], ['dd', 'dd', '8a']]
1
yatu 23 jun. 2020 a las 14:02