Estoy trabajando en Python por primera vez y necesito encontrar una manera eficiente de buscar si una secuencia continua de tres, cuatro o cinco elementos son iguales en una matriz más grande.

Por ejemplo:

array = [1, 0, 0, 0, 1]

Salida:

number_same = 3
element = 0
positions = [1, 2, 3]

¿Alguna sugerencia o ayuda?

¡Thx!

0
user2995603 1 nov. 2017 a las 11:19

4 respuestas

La mejor respuesta

La siguiente línea le dará una lista de tuplas de un valor y sus ubicaciones dentro de la matriz (agrupadas por repetición):

from itertools import groupby
[(k, [x[0] for x in g]) for k, g in groupby(enumerate(array), lambda x: x[1])]
>>> [(1, [0]), (0, [1, 2, 3]), (1, [4])]

Luego puede filtrarlo para obtener solo repeticiones de 3 y más:

filter(lambda x: len(x[1])>2, grouped_array)

Usó la siguiente respuesta como referencia: ¿Cuál es la forma más pitónica de identificar consecutivamente duplicados en una lista?

3
Uri Hoenig 1 nov. 2017 a las 09:03

Creo que la clase Counter será útil para usted.

from collections import Counter
array = [1, 0, 0, 0, 1]
counter = Counter(array)
mc = counter.most_common(20)
print(mc)

# [(0, 3), (1, 2)]
most_common = mc[0][0] #  = 0
number_same = mc[0][1] #  = 3
positions = [i for i, x in enumerate(array) if x == most_common]

La última línea que viene de esta publicación SO.

0
The Pjot 1 nov. 2017 a las 08:31

No conozco Python bien, pero no imagino que haya una función incorporada para lograr esto.

Podría recorrer la lista y usar una segunda matriz como contador.

Es decir, si el número en la posición 0 es un 1, agregue 1 a la posición 1 en la segunda matriz

original_array = [1, 0, 0, 0, 1]
second_array_after_populating = [3, 2, 0, 0, 0]

Entonces puede escanear la lista una vez para encontrar el número más común y cuántos de ese número. Una vez que sepa el número, puede escanear hacia atrás a través de la lista original para encontrar las posiciones en las que aparece.

0
GrepGrep 1 nov. 2017 a las 08:28

Esta no es una respuesta completa, pero es un comienzo.

Esto utiliza el método groupby() asociado con la biblioteca itertools. El método groupby() busca grupos secuenciales de valores (a diferencia de los verdaderos grupos de valores), por lo que es ideal para encontrar secuencias.

array = [1, 0, 0, 0, 1]

from itertools import groupby

g = groupby(array)
for value, grp in g:

grp es un iterador ... podemos exponer los contenidos mediante la función list() para extraer los valores en una lista.

    grp = list(grp)
    length = len(grp)

La declaración if que utiliza in es un método conveniente para verificar varios valores.

    if length in [3, 4, 5]:
        print('number_same =', length)
        print('element =', value)
        print('positions =', 'still working on this')

==== OUTPUT ====
number_same = 3
element = 0
positions = still working on this
0
E. Ducateme 1 nov. 2017 a las 08:38