{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": { "id": "eYHfIKROMii0" }, "source": [ "# Listas\n", "\n", "Las **listas** son un tipo de objeto que nos permite guardar una secuencia de otros objetos, actualizarlos, añadir nuevos y borrarlos. A diferencia de todos los tipos que hemos visto hasta ahora, las listas con objetos **mutables**, es decir, pueden cambiar durante la ejecución de nuestro programa. \n", "\n", "Para crear una lista en Python usamos corchetes y escribimos sus elementos separados por comas `[item1, item2, ..., itemN]`. Los objetos de una lista **no tienen por qué ser del mismo tipo de objeto**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "JmvoO1AnNirL", "outputId": "e5848d0d-6cc9-4569-9237-6be666a8b207" }, "outputs": [ { "data": { "text/plain": [ "[3.5, None, 'foo']" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[3.5, None, \"foo\"]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "KFHrUKuPRn6y", "outputId": "711c83e2-1da3-43df-9d7c-09e9c50f79cd" }, "outputs": [ { "data": { "text/plain": [ "list" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type([1, 2, 3])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "rk6GMpGBRpjZ", "outputId": "aad0dce6-1fc5-445d-c93f-5bff78705cc0" }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# lista vacía\n", "[]" ] }, { "cell_type": "markdown", "metadata": { "id": "RNbpSdysRvDl" }, "source": [ "Puedes incluir variables y expresiones en la definición de la lista. Python evaluará dichas expresiones y luego construirá la lista. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "bfBlnz8nUf1n", "outputId": "76a38206-9be7-46c2-d06c-30b62afcc4dc" }, "outputs": [ { "data": { "text/plain": [ "[True, 'Foo', 25, [1, 2]]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = \"foo\"\n", "[2 < 3, x.capitalize(), 5**2, [1, 2]]" ] }, { "cell_type": "markdown", "metadata": { "id": "IX91AgsCUnMT" }, "source": [ "El tipo `list` puede ser utilizado para convertir otros tipos de objetos a listas, en concreto aquellos que sean **iterables**, cosa que definiremos más adelante. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "TSKnJKX-U4-x", "outputId": "a2731d8c-3a23-4d80-e068-e49f3712df91" }, "outputs": [ { "data": { "text/plain": [ "['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(\"hello world\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 171 }, "id": "7u0UNSmPU62b", "outputId": "e634035d-7e5c-4d76-a82e-3d7b1616eacc" }, "outputs": [ { "ename": "TypeError", "evalue": "ignored", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: 'int' object is not iterable" ] } ], "source": [ "list(1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "WHBI-StWU9KR", "outputId": "e146fe5c-c56e-40e9-b946-1a3ed9cd61cb" }, "outputs": [ { "data": { "text/plain": [ "[1]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list([1])" ] }, { "cell_type": "markdown", "source": [ "---\n", "## Las listas son iterables\n", "Los **objetos iterables** son aquellos compatibles con operaciones de iteración, la más común de ellas el buque *for*, que veremos más adelante. Otros objetos iterables pueden ser las tuplas, los diccionarios, los conjuntos, los rangos, los generadores, los arrays de numpy etc. Dado un iterable `s`, podemos realizar las siguientes operaciones\n", "\n", "| Operación | Descripción |\n", "|:---------------|:-----------------|\n", "| `for vars in s:`| Iteración |\n", "| `x, y, ... = s`| Deshacer en variables |\n", "| `x in s` `x not in s`| Pertenencia |\n", "| `[a, *s, b]`| Expandir |" ], "metadata": { "id": "TNLP8lOB8GS7" } }, { "cell_type": "markdown", "source": [ "Veamos algunos ejemplos" ], "metadata": { "id": "Hpk-UYZW-ulo" } }, { "cell_type": "code", "source": [ "items = [3, 4, 5]\n", "x, y, z = items\n", "print(x, y, z)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "1y3BXbb6-oz7", "outputId": "24125444-f1c7-4201-d70c-8dc4b5790204" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "3 4 5\n" ] } ] }, { "cell_type": "code", "source": [ "\"a\" in items" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "WrLIKQ7w-ttt", "outputId": "d375ed9b-cf5a-42c2-f69f-d8d47dbc7b7a" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "False" ] }, "metadata": {}, "execution_count": 20 } ] }, { "cell_type": "code", "source": [ "a = [1, 2, *items, 6]\n", "a" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Podyie0C-8U_", "outputId": "cd66c739-a85d-42b7-a37e-bb950f91b031" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[1, 2, 3, 4, 5, 6]" ] }, "metadata": {}, "execution_count": 21 } ] }, { "cell_type": "markdown", "source": [ "Existen muchas funciones predefinidas que aceptan un iterable como argumento, aquí exponemos algunas de ellas\n", "\n", "| Función | Descripción |\n", "|:---------------|:-----------------|\n", "| `list(s)`| Crea una lista a partir de `s`|\n", "| `tuple(s)`| Crea una tupla a partir de `s`|\n", "| `set(s)`| Crea una conjunto a partir de `s`|\n", "| `min(s, [,key])`| Mínimo de `s`|\n", "| `max(s, [,key])`| Máximo de `s`|\n", "| `any(s)`| Devuelve `True` si algún item de `s` es verdadero|\n", "| `all(s)`| Devuelve `True` si todos los items de `s` son verdaderos|\n", "| `sum(s, [, initial])`| Suma de `s` |\n", "| `sorted(s, [, key])`| Crea una lista ordenada |\n" ], "metadata": { "id": "gOHvUH04_VM5" } }, { "cell_type": "markdown", "metadata": { "id": "cehmTnGFVBzV" }, "source": [ "---\n", "## Las listas son secuencias\n", "\n", "Al igual que las cadenas, las listas **son secuencias**, por lo que el orden de sus objetos es importante y podemos acceder a los mismo mediante un índice entero que empieza en cero. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "D5lEyj4mWb-E", "outputId": "773793a3-191a-47f5-bf22-e981f457654e" }, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# El orden importa\n", "[1, \"a\", True] == [\"a\", 1, True]" ] }, { "cell_type": "markdown", "metadata": { "id": "a76IipNqWhiX" }, "source": [ "Podemos utilizar la misma sintaxis de indexado que vimos con las cadenas utilizando corchetes y `:`. \n", "\n", "En las secuencias, el método que nos da la longitud del objeto es `len`" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "hqpUgwgjW-GD", "outputId": "e75a98c5-35c7-4374-835c-f6de1db1d0a8" }, "outputs": [ { "data": { "text/plain": [ "5" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = [2, 4, 6, 8, 10]\n", "len(x)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "D0oJAeMbXDM1", "outputId": "8624c088-2552-41c0-d88e-fb5a0d837aec" }, "outputs": [ { "data": { "text/plain": [ "11" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = \"hello world\"\n", "len(x)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 190 }, "id": "y4eiEu3CXR6O", "outputId": "46777d4a-1289-4a89-9c83-90ae4fb4dd52" }, "outputs": [ { "ename": "TypeError", "evalue": "ignored", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: object of type 'int' has no len()" ] } ], "source": [ "x = 1\n", "len(x)" ] }, { "cell_type": "markdown", "metadata": { "id": "ikcTeUSuX4Zo" }, "source": [ "---\n", "## Las listas son mutables\n", "\n", "Las listas son utilizadas cuando queramos almacenar datos que pueden cambiar o deben actualizarse, ya que *las listas pueden cambiar una vez han sido creadas*, o dicho de otro modo, son objetos **mutables**. Veámoslo con un ejemplo" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "dyrlruFjYccj", "outputId": "ef75fa33-7203-45b3-bcb3-40d9b138917c" }, "outputs": [ { "data": { "text/plain": [ "[2, 'apple', 6, 8, 10]" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = [2, 4, 6, 8, 10]\n", "y = [2, 4, 6, 8, 10]\n", "\n", "# asignamos una cadena al segundo objeto de x\n", "x[1] = \"apple\"\n", "x" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "cSm9JjtYYgCc", "outputId": "23a66362-c7aa-4378-fbee-a2b05a3dce75" }, "outputs": [ { "data": { "text/plain": [ "[2, -3, -4, -5, 10]" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# podemos realizar asignaciones a nivel de lista\n", "y[1:4] = [-3, -4, -5]\n", "y" ] }, { "cell_type": "markdown", "metadata": { "id": "jKq9JKUKZQs8" }, "source": [ "Dos métodos muy utilizados a la hora de manipular listas son el `append` que nos permiten añadir un elemento a la cola de lista y `extend` para añadir varios" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "bDCFze6jZknl", "outputId": "3bc730d1-7555-4dee-ad8e-954184b3147b" }, "outputs": [ { "data": { "text/plain": [ "[2, 4, 6, 8, 10, 'foo']" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = [2, 4, 6, 8, 10]\n", "x.append(\"foo\")\n", "x" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "uXJBMLRRZof6", "outputId": "cbcb38f7-ea46-46b4-ac4b-d145bcefb193" }, "outputs": [ { "data": { "text/plain": [ "[2, 4, 6, 8, 10, 'foo', True, False, None]" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# a extend tenemos que pasarle una lista de objetos\n", "x.extend([True, False, None])\n", "x" ] }, { "cell_type": "markdown", "metadata": { "id": "LK7dInqoZyBW" }, "source": [ "Estos métodos realizan las operaciones *inplace*, es decir, modifican el objeto sin necesidad de tener que asignarlo. No tiene sentido escribir algo como `x = x.append(\"foo\")`, de hecho el método `append` devuelve `None`" ] }, { "cell_type": "markdown", "metadata": { "id": "oHmGveVgaRri" }, "source": [ "Otros métodos que pueden ser útiles con listas son \n", "- `pop(n)`: devuelve el elemento `n`-ésimo y lo borra de la lista. Devuelve un `IndexError` si `n` está fuera del índice.\n", "- `remove(a)`: borra el primer elemento cuyo valor coincida con `a`. Devuelve un `ValueError` si no encuentra el valor. \n", "- `insert(n, a)`: inserta el objeto `a` en la posición `n`-ésima de la lista" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 36 }, "id": "BguQEa5vazye", "outputId": "c321678d-02ac-4788-ae2e-3526392ed9ca" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "'c'" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "string" } }, "metadata": {}, "execution_count": 1 } ], "source": [ "x = [\"a\", \"b\", \"c\", \"d\"]\n", "x.pop(2)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Ascz_a90a59v", "outputId": "d721f4c9-dd2b-49bd-93c9-5eb44e0333a0" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "['a', 'b', 'd']" ] }, "metadata": {}, "execution_count": 2 } ], "source": [ "x" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "GDWYMJpvbAMj", "outputId": "6c944a59-bbd7-4f66-d50c-b1c85724958b" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "['a', 'b', 'd', 'a']" ] }, "metadata": {}, "execution_count": 3 } ], "source": [ "x.append(\"a\")\n", "x" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "LhAJavfLbfpJ" }, "outputs": [], "source": [ "x.remove(\"a\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "wVNeMbz0bjAX", "outputId": "8a769adf-6ea5-4901-84f2-26509df29ce2" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "['b', 'd', 'a']" ] }, "metadata": {}, "execution_count": 5 } ], "source": [ "x" ] }, { "cell_type": "code", "source": [ "x.insert(2, None)\n", "x" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "TkCOd1TR5dmk", "outputId": "18900d8e-9958-42e2-fef7-4ab0ab5768f8" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "['b', 'd', None, 'a']" ] }, "metadata": {}, "execution_count": 6 } ] }, { "cell_type": "markdown", "source": [ "Podemos concatenar listas usando el operador `+`. En caso de tener listas anidadas, es posible aplicar directamente más de una operación de indexado. " ], "metadata": { "id": "2O5VVVwT504i" } }, { "cell_type": "code", "source": [ "x = [[1, \"foo\"], [\"bar\", None], True, 3.5]\n", "x[1][0]" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 36 }, "id": "FNLsnPk66Kmt", "outputId": "154d7743-84b5-432c-b3e1-fd063ae90aee" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "'bar'" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "string" } }, "metadata": {}, "execution_count": 8 } ] }, { "cell_type": "markdown", "metadata": { "id": "Tb2z78UQynEt" }, "source": [ ":::{exercise}\n", ":label: lists-index\n", "\n", "Modifica la siguiente lista\n", "\n", "```\n", "l = [[1, \"foo\"], [\"bar\", None], True, 3.5]\n", "```\n", "para obtener \n", "\n", "```\n", "[[1, \"baz\"], [\"bar\", None], True, -1.5, [0, 1, 0]]\n", "```\n", "\n", ":::" ] }, { "cell_type": "markdown", "source": [ ":::{exercise}\n", ":label: lists-comparison\n", "\n", "Condiera una lista `s` y definamos \n", "\n", "```\n", "r = list(s)\n", "t = s\n", "```\n", "\n", "Indica si las siguientes expresiones son verdaderas o falsas \n", "- `r == s`\n", "- `r is s`\n", "- `s is t`\n", "\n", ":::" ], "metadata": { "id": "t-OHv0q3In29" } }, { "cell_type": "markdown", "source": [ "Para el siguiente ejercicio, puedes utilizar el módulo `time` o el [**comando mágico**](https://ipython.readthedocs.io/en/stable/interactive/magics.html) de jupyter `%%time` para obtener el tiempo de ejecución de una celdilla. " ], "metadata": { "id": "g6oJoG2vRYeG" } }, { "cell_type": "code", "source": [ "%%time\n", "\n", "3**999" ], "metadata": { "id": "ILIzM16jR7XG", "outputId": "40a770bc-ff15-48b1-d1d3-0a7f55c593e5", "colab": { "base_uri": "https://localhost:8080/" } }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "CPU times: user 9 µs, sys: 0 ns, total: 9 µs\n", "Wall time: 13.4 µs\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "440690273160268878963485086584048121988474010917382722554973456075609532448901633180259437950202687321303259232290860785316984860700206303955114241752651224675873408399440267959338258076321613758130133372529539347042982605207698146020522057684695558163502059375160114801849018132346298605821789418305378740276756187926194096742805466102629298972852134694966312536457747390615453312898505588339646862703020142029890479621367604783461882915721944003538122044057700922967618406667" ] }, "metadata": {}, "execution_count": 65 } ] }, { "cell_type": "code", "source": [ "import time\n", "\n", "start = time.time()\n", "3**999\n", "end = time.time()\n", "print(f\"Execution time: {end - start:0.8f} seconds\")" ], "metadata": { "id": "NpzhtYgETGj2", "outputId": "b3ab9a5f-9e1f-402d-9ab6-abbb6608d182", "colab": { "base_uri": "https://localhost:8080/" } }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Execution time: 0.00009036 seconds\n" ] } ] }, { "cell_type": "markdown", "source": [ ":::{exercise}\n", ":label: lists-membership\n", "\n", "Usando la estructura `list(range(n))`, crea listas de diferentes tamaños y estima la complejidad computacional en cuanto a tiempo de cómputo de comprobar la pertenencia a una lista. \n", "\n", ":::" ], "metadata": { "id": "fvQyxNzbIlC2" } } ], "metadata": { "colab": { "provenance": [], "authorship_tag": "ABX9TyNx96k6EABw5szvuaOUIKqM", "include_colab_link": true }, "kernelspec": { "display_name": "Python 3.9.1 64-bit", "language": "python", "name": "python3" }, "language_info": { "name": "python", "version": "3.9.1" }, "vscode": { "interpreter": { "hash": "397704579725e15f5c7cb49fe5f0341eb7531c82d19f2c29d197e8b64ab5776b" } } }, "nbformat": 4, "nbformat_minor": 0 }