Por ejemplo, hay una lista, [1,2,3] con una restricción tal que cada elemento de la lista mezclada no debe superponerse con la ubicación de los elementos anteriores. Para aclarar la explicación, digamos que la lista anterior era [1,2,3], pero después de barajar se convierte en [1,3,2]. Para este caso, dado que 1 es el primer elemento de ambas listas, esto no satisface la restricción. Las salidas que satisfacen esa restricción serían, [2,3,1] y [3,1,2].

¿Hay alguna forma de hacer esta restricción antes de barajar la lista?

Gracias de antemano.

1
cycla 27 feb. 2021 a las 02:49

2 respuestas

La mejor respuesta

Según su especificación, lo que está pidiendo son todas las posibles rotaciones de la lista. Por ejemplo:

def rotations(lst):
    for i in range(len(lst)):
        print(lst)
        lst.append(lst.pop(0))
0
Tim Roberts 27 feb. 2021 a las 04:26

Puede lograr esto rotando la lista. Por ejemplo, las rotaciones de [1, 2, 3] son [3, 1, 2] y [2, 3, 1].

Tenga en cuenta que para longitudes> 3, las rotaciones serán un subconjunto de todos los cambios posibles que se ajustan a sus restricciones, pero si lo entiendo correctamente, eso funciona para usted. Por ejemplo, con la entrada [1, 2, 3, 4], [4, 3, 2, 1] es una salida válida, pero no una rotación.

collections.deque facilita la rotación, además está optimizado para la rotación.

random.randrange() se puede utilizar para aleatorizar la rotación. contar.

import random
import collections

def random_rotation(lst):
    """
    Rotate a list by a random amount.

    Similar to "random.shuffle()", but ensures that all elements will move.
    """
    n = random.randrange(1, len(lst))
    d = collections.deque(lst)
    d.rotate(n)
    lst[:] = d  # Overwrite

L = [1, 2, 3, 4]
random_rotation(L)
print(L)

Ejemplo de salida:

[2, 3, 4, 1]
1
wjandrea 27 feb. 2021 a las 05:10