Python Quiz 11 – Listas por multiplicación y manejo de enumerados en Python
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.