es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo distinguir entre una tupla y una lista en el patrón estructural de coincidencia en Python?

Quiero usar el emparejamiento de patrones estructural de Python para distinguir entre una tupla (por ejemplo, que representa un punto) y una lista de tuplas.

Sin embargo, el enfoque directo no funciona:
python
def fn(p):
match p:
case (x, y):
print(f"punto individual: ({x}, {y})")
case [*points]:
print("lista de puntos:")
for x, y in points:
print(f"({x}, {y})")

fn((1, 1))
fn([(1, 1), (2, 2)])

que produce el siguiente resultado:

punto individual: (1, 1)
punto individual: ((1, 1), (2, 2))

mientras que lo que quiero es:

punto individual: (1, 1)
lista de puntos:
(1, 1)
(2, 2)

Cambiar el orden de las declaraciones case tampoco ayuda aquí.

¿Cuál es una buena manera de resolver esto con el emparejamiento de patrones?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Un enfoque es utilizar la función isinstance para comprobar el tipo del argumento antes de intentar hacer coincidir:

    def fn(p):
        if isinstance(p, tuple):
            x, y = p
            print(f"punto único: ({x}, {y})")
        elif isinstance(p, list):
            print("lista de puntos:")
            for x, y in p:
                print(f"({x}, {y})")
    
    fn((1, 1))
    fn([(1, 1), (2, 2)])
    

    lo que produce el siguiente resultado:

    punto único: (1, 1)
    lista de puntos:
    (1, 1)
    (2, 2)
    

Comments are closed.