Python Quiz 11 – Listas por multiplicación y manejo de enumerados en Python

PyQuiz 11 - Listas por multiplicación y manejo de enumerados

Pregunta principal del PyQuiz:

>>> lst = []
>>> elems = [None] * 3
>>> for i, x in enumerate(elems, start=65):
...     lst.append(chr(i))
...
>>> print('-'.join(lst))
- ?? -
A = 'None-None-None'
B = '65-65-65'
C = 'A-B-C'

Concepto y explicación

En esta pregunta hay diferentes conceptos básicos que se pueden estudiar y de los que aprender a dominar prefectamente.

Crear listas por multiplicación de elementos

Dado que las listas son mutables en Python, existen algunas herramientas que permiten su creación de forma facil.

Una de las herramientas para crear listas a partir de elementos es la multiplicación por un número. En este caso se crea una lista con algunos elementos y se multiplica por un número entero, dando como resultado una lista de tamaño len(lista) * <num>.

>>> [1] * 5
[1, 1, 1, 1, 1]
>>> [0] * 10
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
>>> [[0, 1, 2]] * 3
[[0, 1, 2], [0, 1, 2], [0, 1, 2]]
>>> [None] * 5
[None, None, None, None, None]

Utilizando esta técnica para crear listas hay que tener en cuenta la mutabilidad de las variables.

Si se multiplica una lista plana (sin elementos anidados), el resultado será una nueva lista. Sin embargo, si la lista a multiplicar es anidada o un diccionario, cada elemento de la lista resultante estará ligado al elemento multiplicado, y al cambiar el mismo, cambiará la lista final:

>>> a = ['1', 'Juan', 'Ana']
>>> a * 5
['1', 'Juan', 'Ana', '1', 'Juan', 'Ana', '1', 'Juan', 'Ana', '1', 'Juan', 'Ana', 
'1', 'Juan', 'Ana']
>>> a * 2
['1', 'Juan', 'Ana', '1', 'Juan', 'Ana']
>>> b = a * 2
>>> b
['1', 'Juan', 'Ana', '1', 'Juan', 'Ana']
>>> a
['1', 'Juan', 'Ana']
>>> a[1] = 'Pepe'
>>> a
['1', 'Pepe', 'Ana']
>>> b
['1', 'Juan', 'Ana', '1', 'Juan', 'Ana']
>>> c = [a] * 3
>>> c
[['1', 'Pepe', 'Ana'], ['1', 'Pepe', 'Ana'], ['1', 'Pepe', 'Ana']]
>>> a[0] = 'Martin'
>>> a
['Martin', 'Pepe', 'Ana']
>>> c
[['Martin', 'Pepe', 'Ana'], ['Martin', 'Pepe', 'Ana'], ['Martin', 'Pepe', 'Ana']]
>>> dd = dict(num=4, color='red')
>>> d = [dd] * 3
>>> dd
{'num': 4, 'color': 'red'}
>>> d
[{'num': 4, 'color': 'red'}, {'num': 4, 'color': 'red'}, {'num': 4, 'color': 'red'}]
>>> dd['new'] = 'Pepe'
>>> dd
{'num': 4, 'color': 'red', 'new': 'Pepe'}
>>> d
[{'num': 4, 'color': 'red', 'new': 'Pepe'}, {'num': 4, 'color': 'red', 'new': 'Pepe'}, 
{'num': 4, 'color': 'red', 'new': 'Pepe'}]

Por lo que hay que prestar especial atención al usar esta técnica, y se recomienda usar sólo con variables inmutables y simples.

Usar start en enumerate correctamente

El constructor de elementos enumerate se utiliza para generar una secuencia de pares de elementos donde el primer elemento es el índice del elemento y el segundo es el elemento por el que se itera.

Adicionalmente, se puede añadir un parámetro para definir el valor de comienzo de la variable índice:

>>> list(enumerate('hola', start=1))
[(1, 'h'), (2, 'o'), (3, 'l'), (4, 'a')]
>>> list(enumerate('mundo', start=200))
[(200, 'm'), (201, 'u'), (202, 'n'), (203, 'd'), (204, 'o')]

Gracias a esta característica y sabiendo que los números asociados a los caracteres en mayúscula comienzan en el 65 de la tabla unicode, se pueden imprimir las letras mayúsculas del alfabeto fácilmente:

>>> [chr(i) for i, _ in enumerate(range(5), start=65)]
['A', 'B', 'C', 'D', 'E']
>>> [chr(i) for i, _ in enumerate(range(5), start=9818)]
['♚', '♛', '♜', '♝', '♞']

Como se ve en el ejemplo, se pueden imprimir los caracteres que representan las fichas de ajedrez de igual forma, únicamente es necesario conocer el número por el que comienza la secuencia en la tabla de unicode.

Manejar la función str.join de forma correcta

Por último, sólo es necesario unir todos los caracteres que se han elegido uniendolos por un caracter ‘-‘ (guión).

Para esta tarea, la forma más simple es utilizar la función join de las cadenas de caracteres:

>>> '-'.join(['A', 'B', 'C', 'D', 'E'])
'A-B-C-D-E'
>>> '___'.join(['A', 'B', 'C', 'D', 'E'])
'A___B___C___D___E'
>>> ';'.join(['A', 'B', 'C', 'D', 'E'])
'A;B;C;D;E'
>>> ','.join(['A', 'B', 'C', 'D', 'E'])
'A,B,C,D,E'
>>> ' o '.join(['A', 'B', 'C', 'D', 'E'])
'A o B o C o D o E'

Solución

Por tanto, al unir los conceptos explicados anteriormente, se puede ver que la solución correcta es la C :

C) A-B-C


Practica Python con PyQuizzes

En la sección de PyQuizzes puedes encontrar ejercicios prácticos explicados pormenorizado para mejorar tus habilidades como pythonista. ¡No te los pierdas!


Tutorial Python online

Aprender Python de forma gratuita siguiendo las secciones del tutorial de Python.


Libros recomendados para aprender Python

Estos son los libros que pueden ayudarte a aprender Python, aprender a programar, tipos de datos, algoritmia y mucho más.

Disponible en:

Compartir

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Ver más

  • Responsable: Oscar Ramirez.
  • Finalidad:  Moderar los comentarios.
  • Legitimación:  Por consentimiento del interesado.
  • Destinatarios y encargados de tratamiento: No se ceden o comunican datos a terceros para prestar este servicio. El Titular ha contratado los servicios de alojamiento web a ionos (1&1) que actúa como encargado de tratamiento.
  • Derechos: Acceder, rectificar y suprimir los datos.
  • Información Adicional: Puede consultar la información detallada en la Política de Privacidad.

Publicar un comentario