lista1 = ["Hola", 1, 2.0, True]

lista1

lista2 = [2+3, 5+1, 4**2]

lista2

"""
Explanation: ¡Bienvenid@s nuevamente!
Hoy veremos otro tipo de objetos en python llamados listas y además empezaremos a tomar decisiones con expresiones condicionales.
¿Y qué pasa si queremos coleccionar valores? Acerca de las listas...
En la reunión pasada vimos que en python podemos tener diversos tipos de objetos numéricos, booleanos y de caracteres. Incluso aprendimos cómo guardar estos valores en variables, pero que pasa si queremos operar no sólo con un valor sino con una colección de valores. Para este caso hay otro tipo de objetos y el primero que veremos se llama lista.
En python una lista es una secuencia de elementos mutables que llevan asignados un índice. Para crear una lista en python los que se hace es empezar con corchetes que van a ser llenados con valores separados por una coma, éstos valores no necesitan ser del mismo tipo para poder habitar en la misma lista.
Veamos unos ejemplos...
End of explanation
"""


#Para especificar que queremos acceder a un valor en python, el objeto es seguido de corchetes con el índice deseado
lista1[0]

lista2[1]

#¿Qué pasa si damos un índice que no tiene un valor?
lista1[4]

"""
Explanation: Vamos a explorar ahora la parte de los índices y mutabilidad en una lista
Para acceder a un valor en una lista podemos hacer uso de los índices. Los índices empiezan desde cero.
End of explanation
"""


#Vamos a pedirle a python que nos muestre los primero tres elementos de la lista1
lista1[0:3]

"""
Explanation: ¡Obvio! nos da un error de índice... Y nos dice qué está fuera del rango de valores que tenemos guardados en la lista
También tenemos acceso a un rango de valores
End of explanation
"""


#Veamos que pasa si le damos un índice mayor, a pesar de que sabemos que lista1[4] nos da un error
lista1[0:4]

#Otra forma de mostrar todos los elementos es con ":"
lista2[:]

lista2

copia = lista2

copia

copia *2

copia = copia *2

copia

lista2

copia = lista2[:]

copia

copia is lista2

copia.append(13)

copia

lista2

#Aquí le estamos pidiendo a python que nos de todos los elementos de la lista menos el primero
lista1[1:]

#Si queremos ver el último elemento pero no sabemos cuántos hay en una lista podemos usar el siguiente truco
lista1[:-1]

"""
Explanation: Pregunta 1.
Ya vimos que lista1 posee elementos con índices del 0 al 3, ¿por qué te imaginas que en la expresión anterior no nos mostró el último elemento si le pedimos ver del 0:3?
End of explanation
"""


#Si no sabemos un índice, pero sabemos que hay un valor en una lista podemos preguntarle a python cuál es ese índice 
#esto nos dice el índice del primer elemento que se encuentre con ese valor
#(si hay valores repetidos nos da el de menor índice)
lista1.index(2.0)

lista2.index(5)

"""
Explanation: Pregunta 2.
¿Es posible ir saltando un número en el rango con el que seleccionamos las listas? Esto es cómo pedirle a python (si es posible) que me de los elementos con índices pares del rango 1:6 (los índices 2, 4 y 6)
End of explanation
"""


lista3 = lista1[::-1]

lista3

lista1

lista1[::-1]

"""
Explanation: Pregunta 3.
¿Qué resultaría de la siguiente expresión? lista1[::-1]
End of explanation
"""


lista1.append("nuevo")

lista1

"""
Explanation: La parte "mutable" de las listas significa que podemos alterar el contenidos de estas al agregar elementos a la colección y/o cambiando el valor de algunos elementos.
Veamos como agregar elementos a las listas. Para esto usaremos el método .append(elemento) que tienen las listas
End of explanation
"""


lista1.insert(2, "soy")

lista1

"""
Explanation: Como lo has de haber notado, el elemento nuevo que agregaste se va al final de la lista. Si quisieras que tu nuevo elemento estuviera en una posición específica tendrías que usar el método .insert(índice, elemento)
End of explanation
"""


lista1[-1]='Nuevo'

lista1

"""
Explanation: Hay ocasiones en las que no quieres agregar nuevos elementos, pero alterar el valor que tenías de los mismos, para esto puedes accesar por índice al elemento que quieras y directamente asignarle otro valor
End of explanation
"""


lista3

lista3.remove('Hola')

lista3

"""
Explanation: Pregunta 4
¿Cómo le harías para borrar elementos de una lista?
Pista: del y remove
End of explanation
"""


lista3.append(True)

lista3.remove(True)

lista3

"""
Explanation: Pregunta 5
Crea una lista nueva que se llame "copia" de la lista2
End of explanation
"""


#Crea un elemento nuevo en una lista si la longitud es menor a 7 elementos
if len(lista1) < 7:
    lista1.append('elemento')

#Veamos qué pasó con lista1
lista1

del(lista1[3])

lista1

#Si el primer valor de una lista es integer conviértelo a float, de lo contratio conviértelo a integer
if type(lista2[0]) is int:
    lista2[0] = float(lista2[0])
    lista2[1] = float(lista2[1])
elif lista2[2] == 10:
    print(lista2[2])
elif lista2[2] > 10:
    print("si")



#Veamos cómo quedó la lista 2
lista2

"""
Explanation: Expresiones condicionales
Imagina que estás en una calle a punto de cruzarla, ¿Qué es lo que te hace decidir si la cruzas o no?
Lo mismo sucede con python. En este caso le tienes que dar ciertas condiciones que deben ser cumplidas, esto es que al evaluar una expresión, esta resulte en un cierto valor o en True para que siga con una operación. Si es necesario también se le pueden dar instrucciones para cuando la condición no sea cumplida.
Veamos unos ejemplos
End of explanation
"""


and 

"""
Explanation: Aquí hay unas cosas que notar:
1. La estructura inicial de una expresión condicional es if &lt;condición&gt; :
2. Después de esto hay un espacio que nos indica que el código que escribiremos forma parte del condicional
3. La expresión se puede terminar ahí o podemos darle otra instrucción con else: (nótese que else se encuentra al mismo nivel que if)
4. El código que forma parte de else lleva también un espacio (estos espacios son llamados indentación)

Pregunta 6
¿Qué pasa si tengo más de una condición que debe ser cumplida?
End of explanation
"""


