{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Conjuntos con Python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Esta notebook fue creada originalmente como un blog post por [Raúl E. López Briega](http://relopezbriega.com.ar/) en [Mi blog sobre Python](http://relopezbriega.github.io). El contenido esta bajo la licencia BSD.*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\"Conjuntos" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "## Introducción\n", "\n", "Una característica notable de los seres humanos es su inherente necesidad y capacidad de agrupar objetos de acuerdo a criterios específicos.\n", "La idea de la clasificación de ciertos objetos en grupos similares, o *[conjuntos](https://es.wikipedia.org/wiki/Conjunto)*, es uno de los conceptos más fundamentales de la matemática moderna. La [teoría de conjuntos](https://es.wikipedia.org/wiki/Teor%C3%ADa_de_conjuntos) ha sido el marco unificador para todas las matemáticas desde que el matemático alemán [Georg Cantor](https://es.wikipedia.org/wiki/Georg_Cantor) la formulara alrededor de 1870. Ningún campo de las matemáticas podría describirse hoy en día sin hacer referencia a algún tipo de [conjunto](https://es.wikipedia.org/wiki/Conjunto) abstracto.\n", "En términos más generales, el concepto de *membresía* de un [conjunto](https://es.wikipedia.org/wiki/Conjunto), que se encuentra en el corazón de la [teoría de conjuntos](https://es.wikipedia.org/wiki/Teor%C3%ADa_de_conjuntos), explica cómo sentencias con sustantivos y predicados son formulados en nuestro lenguaje, o en cualquier lenguaje abstracto como las matemáticas. Debido a esto, la [teoría de conjuntos](https://es.wikipedia.org/wiki/Teor%C3%ADa_de_conjuntos) está íntimamente ligada a la [lógica](https://es.wikipedia.org/wiki/L%C3%B3gica) y sirve de base para todas las matemáticas.\n", "\n", "## ¿Qué es un conjunto?\n", "\n", "**Un [conjunto](https://es.wikipedia.org/wiki/Conjunto) es una colección de objetos distintos, a menudo llamados elementos o miembros**. Existen dos características hacen de los [conjuntos](https://es.wikipedia.org/wiki/Conjunto) algo totalmente distinto a cualquier otra colección de objetos. En primer lugar, un [conjunto](https://es.wikipedia.org/wiki/Conjunto) está siempre \"bien definido\", es decir que si realizamos la pregunta *¿Este objeto particular, se encuentra en esta colección?*; siempre debe existir una respuesta clara por sí o por no basada en una regla o algunos criterios dados. La segunda característica, es que no hay dos miembros de\n", "un mismo [conjunto](https://es.wikipedia.org/wiki/Conjunto) que sean exactamente iguales, es decir, que no hay elementos repetidos. \n", "Un [conjunto](https://es.wikipedia.org/wiki/Conjunto) puede contener cualquier cosa imaginable, incluyendo números, letras, colores, incluso otros [conjuntos](https://es.wikipedia.org/wiki/Conjunto)!. Sin embargo, ninguno de los objetos del [conjunto](https://es.wikipedia.org/wiki/Conjunto) puede ser el propio [conjunto](https://es.wikipedia.org/wiki/Conjunto). Descartamos esta posibilidad para evitar encontrarnos con la [Paradoja de Russell](https://es.wikipedia.org/wiki/Paradoja_de_Russell), un problema famoso en la lógica matemática desenterrado por el gran lógico británico [Bertrand Russell](https://es.wikipedia.org/wiki/Bertrand_Russell) en 1901.\n", "\n", "## Notación de Conjuntos\n", "\n", "Cuando escribimos a los [conjuntos](https://es.wikipedia.org/wiki/Conjunto) utilizamos letras mayúsculas para sus nombres y para representar al [conjunto](https://es.wikipedia.org/wiki/Conjunto) propiamente dicho simplemente listamos sus elementos separándolos por comas y luego englobamos todos estos elementos dentro de un par de llaves. Así, por ejemplo, A = {1,2,3, ..., 10} es el [conjunto](https://es.wikipedia.org/wiki/Conjunto) de los 10 primeros [números naturales](https://es.wikipedia.org/wiki/N%C3%BAmero_natural) o para *contar*, B = {Rojo, Azul, Verde} es el [conjunto](https://es.wikipedia.org/wiki/Conjunto) de colores primarios, N = {1,2,3, ...} es el [conjunto](https://es.wikipedia.org/wiki/Conjunto) de todos los [números naturales](https://es.wikipedia.org/wiki/N%C3%BAmero_natural), y Z = {..., - 3, -2, -1,0,1,2,3, ...}\n", "es el [conjunto](https://es.wikipedia.org/wiki/Conjunto) de todos los [números enteros](https://es.wikipedia.org/wiki/N%C3%BAmero_entero). Los puntos suspensivos \"...\" se utilizan para describir el carácter *infinito* de los números en los conjuntos N y Z.\n", "\n", "También se utiliza el símbolo $ \\in $ para expresar que determina objeto pertenece o es *miembro* de un [conjunto](https://es.wikipedia.org/wiki/Conjunto) y el símbolo $ \\notin $ para indicar que no pertenece a un [conjunto](https://es.wikipedia.org/wiki/Conjunto). Utilizando los ejemplos anteriores, podríamos por ejemplo escribir que $7 \\in A$ y $12 \\notin A$.\n", "\n", "Dado que muchos [conjuntos](https://es.wikipedia.org/wiki/Conjunto) no se pueden describir listando todos sus miembros, ya que en muchos casos esto es imposible, también se utiliza la mucho más potente notación de constructor de conjuntos o predicado. En esta notación escribimos el conjunto de acuerdo a qué tipos de objetos pertenecen al [conjunto](https://es.wikipedia.org/wiki/Conjunto), que se colocan a la izquierda del símbolo \"|\", que significa \"de tal manera que,\" dentro de las llaves; así como las condiciones que estos objetos deben cumplir para pertenecer al [conjunto](https://es.wikipedia.org/wiki/Conjunto), las cuales se colocan a la derecha de \"|\" dentro de las llaves. Por ejemplo, el [conjunto](https://es.wikipedia.org/wiki/Conjunto) de los [números racionales](https://es.wikipedia.org/wiki/N%C3%BAmero_racional), o fracciones, que se denota por Q no puede ser descrito por el método de listar todos sus miembros. En su lugar, se define a Q utilizando la notación de predicado de la siguiente manera:\n", "$Q=\\{\\frac{p}{q} \\mid p, q \\in Z$ y $q \\ne 0 \\}$\n", "Esto se lee \"Q es el conjunto de todas las fracciones de la forma p sobre q, tal que p y q son números enteros y q no es cero.\" También podríamos escribir al conjunto A de nuestro ejemplo anterior como $A = \\{x \\mid x \\in N$ y\n", "$x < 11\\}$.\n", "\n", "## Conjuntos numéricos\n", "\n", "Dentro de las matemáticas, los principales [conjuntos](https://es.wikipedia.org/wiki/Conjunto) numéricos que podemos encontrar y que tienen un carácter universal son:\n", "\n", "* $\\mathbb{N} = \\{1,2,3, ...\\}$ es el conjunto de los [números naturales](https://es.wikipedia.org/wiki/N%C3%BAmero_natural).\n", "* $\\mathbb{W} = \\{0,1,2,3, ...\\}$ es el conjunto de los [números enteros](https://es.wikipedia.org/wiki/N%C3%BAmero_entero) positivos.\n", "* $\\mathbb{Z} = \\{...,-3,-2,-1,0,1,2,3, ...\\}$ es el conjunto de todos los [números enteros](https://es.wikipedia.org/wiki/N%C3%BAmero_entero).\n", "* $\\mathbb{Q} =\\{\\frac{p}{q} \\mid p, q \\in Z$ y $q \\ne 0 \\}$ es el conjunto de los [números racionales](https://es.wikipedia.org/wiki/N%C3%BAmero_racional).\n", "* $\\mathbb{R}$, es el conjunto de los [números reales](https://es.wikipedia.org/wiki/N%C3%BAmero_real). Estos son todos los números que pueden ser colocados en una recta numérica unidimensional que se extiende sin fin tanto en negativo como positivo.\n", "* $\\mathbb{I}$, es el conjunto de los [números irracionales](https://es.wikipedia.org/wiki/N%C3%BAmero_irracional). Algunos de los números más importantes en matemáticas pertenecen a este conjunto,incluyendo $\\pi, \\sqrt{2}, e$ y $\\phi$.\n", "* $\\mathbb{C}$, es el conjunto de los [números complejos](https://es.wikipedia.org/wiki/N%C3%BAmero_complejo). Estos son los números que contienen una parte real y otra parte imaginaria.\n", "\n", "## Igualdad entre conjuntos\n", "\n", "El concepto de igualdad en los [conjuntos](https://es.wikipedia.org/wiki/Conjunto), difiere levemente del clásico concepto de igualdad que solemos tener. Dos conjuntos A y B se dice que son iguales (expresado por A = B), si y sólo si ambos [conjuntos](https://es.wikipedia.org/wiki/Conjunto) tienen exactamente los mismos elementos. Por ejemplo el [conjunto](https://es.wikipedia.org/wiki/Conjunto) A={1,2,3,4} es igual al [conjunto](https://es.wikipedia.org/wiki/Conjunto) B={4,3,2,1}.\n", "Un [conjunto](https://es.wikipedia.org/wiki/Conjunto) importante, y que todavía no hemos mencionado es el **[conjunto vacío](https://es.wikipedia.org/wiki/Conjunto_vac%C3%ADo)**, el cual no tiene elementos y por tanto no puede ser igualado con ningún otro [conjunto](https://es.wikipedia.org/wiki/Conjunto). Se expresa con el símbolo $\\emptyset$ o {}.\n", "\n", "## Cardinalidad \n", "\n", "La [cardinalidad](https://es.wikipedia.org/wiki/Conjunto#Cardinalidad) de un [conjunto](https://es.wikipedia.org/wiki/Conjunto) A es el número de elementos que pertenecen a A y lo expresamos como n(A). La [cardinalidad](https://es.wikipedia.org/wiki/Conjunto#Cardinalidad) de un [conjunto](https://es.wikipedia.org/wiki/Conjunto) puede ser pensada tambien como una medida de su \"tamaño\". Si la [cardinalidad](https://es.wikipedia.org/wiki/Conjunto#Cardinalidad) de un [conjunto](https://es.wikipedia.org/wiki/Conjunto) es un [número entero](https://es.wikipedia.org/wiki/N%C3%BAmero_entero), entonces el conjunto se dice que es finito. De lo contrario, el conjunto se dice que es infinito. Así por ejemplo la [cardinalidad](https://es.wikipedia.org/wiki/Conjunto#Cardinalidad) del [conjunto](https://es.wikipedia.org/wiki/Conjunto) A={1,2,...,9,10} es 10 y lo expresamos como n(A)=10.\n", "\n", "## Subconjunto y subconjunto propio\n", "\n", "Si todos los elementos de un [conjunto](https://es.wikipedia.org/wiki/Conjunto) A son también elementos de otro [conjunto](https://es.wikipedia.org/wiki/Conjunto) B, entonces A se llama un [subconjunto](https://es.wikipedia.org/wiki/Subconjunto) de B y lo expresamos como $A \\subseteq B$. En cierto sentido, se puede\n", "pensar al [subconjunto](https://es.wikipedia.org/wiki/Subconjunto) A como dentro, o contenido en el [conjunto](https://es.wikipedia.org/wiki/Conjunto) B.\n", "Si un [conjunto](https://es.wikipedia.org/wiki/Conjunto) A es un [subconjunto](https://es.wikipedia.org/wiki/Subconjunto) de B y los dos [conjuntos](https://es.wikipedia.org/wiki/Conjunto) no son iguales, entonces llamamos A un [subconjunto propio](https://es.wikipedia.org/wiki/Subconjunto#Subconjunto_propio) de B y lo expresamos como $A \\subset B$. En este caso, se dice que el [conjunto](https://es.wikipedia.org/wiki/Conjunto) A esta propiamente contenido en B.\n", "Algunas propiedades importantes relacionadas con [subconjuntos](https://es.wikipedia.org/wiki/Subconjunto) y [subconjuntos propios](https://es.wikipedia.org/wiki/Subconjunto#Subconjunto_propio) son las siguientes:\n", "\n", "* Cualquier [conjunto](https://es.wikipedia.org/wiki/Conjunto) A es un [subconjunto](https://es.wikipedia.org/wiki/Subconjunto) de sí mismo. Por lo tanto $A \\subseteq A$. Esto es claramente cierto.\n", "* Menos obvio es el hecho de que el [conjunto vacío](https://es.wikipedia.org/wiki/Conjunto_vac%C3%ADo) es un subconjunto de cualquier conjunto A. Por lo tanto $\\emptyset \\subseteq A$. Esta propiedad se prueba a través de la contradicción, ya que si asumimos que existe un [conjunto](https://es.wikipedia.org/wiki/Conjunto) A del que el [conjunto vacío](https://es.wikipedia.org/wiki/Conjunto_vac%C3%ADo) no es un [subconjunto](https://es.wikipedia.org/wiki/Subconjunto), entonces esto quiere decir que el [conjunto vacío](https://es.wikipedia.org/wiki/Conjunto_vac%C3%ADo) debe contener un elemento que no se encuentra en A y esto es absurdo ya que el [conjunto vacío](https://es.wikipedia.org/wiki/Conjunto_vac%C3%ADo) no contiene ningún elemento.\n", "* El [conjunto vacío](https://es.wikipedia.org/wiki/Conjunto_vac%C3%ADo) es un [subconjunto propio](https://es.wikipedia.org/wiki/Subconjunto#Subconjunto_propio) de cualquier [conjunto](https://es.wikipedia.org/wiki/Conjunto) A, siempre y cuando A no se también un [conjunto vacío](https://es.wikipedia.org/wiki/Conjunto_vac%C3%ADo).\n", "* Para los [conjuntos](https://es.wikipedia.org/wiki/Conjunto) finitos A y B, si $A \\subseteq B$, entonces $n(A) \\leq n(B)$.\n", "* De forma similar, para los [conjuntos](https://es.wikipedia.org/wiki/Conjunto) finitos A y B, si $A \\subset B$, entonces $n(A) < n(B)$.\n", "\n", "\n", "## Conjunto potencia\n", "\n", "El [conjunto potencia](https://es.wikipedia.org/wiki/Conjunto_potencia) de un [conjunto](https://es.wikipedia.org/wiki/Conjunto) A, expresado por $P_{A}$, es el [conjunto](https://es.wikipedia.org/wiki/Conjunto) formado por todos los distintos [subconjuntos](https://es.wikipedia.org/wiki/Subconjunto) de A. Así por ejemplo el [conjunto potencia](https://es.wikipedia.org/wiki/Conjunto_potencia) del [conjunto](https://es.wikipedia.org/wiki/Conjunto) $A=\\{1,2,3\\}$; va a ser igual a $P_{A}=\\{\\emptyset,\\{1\\},\\{2\\},\\{3\\},\\{1,2\\},\\{2,3\\}, \\{1,3\\},\\{1,2,3\\}\\}$.\n", "\n", "Un teorema importante de la [teoría de conjuntos](https://es.wikipedia.org/wiki/Teor%C3%ADa_de_conjuntos) establece que si A es un [conjunto](https://es.wikipedia.org/wiki/Conjunto) con k elementos, es decir que n(A) = k; entonces el [conjunto potencia](https://es.wikipedia.org/wiki/Conjunto_potencia) de A tiene exactamente $2^k$ elementos. Escribimos esto como $n(P_{A}) = 2^k$. En nuestro ejemplo anterior podemos ver que n(A)=3, por lo tanto $n(P_{A}) = 2^3$, lo que es igual a los 8 elementos que vimos que tiene el [conjunto potencia](https://es.wikipedia.org/wiki/Conjunto_potencia) de A.\n", "\n", "## Algebra de conjuntos\n", "\n", "El [álgebra de conjuntos](https://es.wikipedia.org/wiki/%C3%81lgebra_de_conjuntos) es el estudio de las operaciones básicas que podemos realizar con los [conjuntos](https://es.wikipedia.org/wiki/Conjunto). Las operaciones básicas del álgebra de conjuntos son:\n", "\n", "* **Unión**. La [unión](https://es.wikipedia.org/wiki/Uni%C3%B3n_de_conjuntos) de dos conjuntos A y B es el conjunto $A \\cup B$ que contiene todos los elementos de A y de B. \n", "\n", "\n", "* **Intersección**. La [intersección](https://es.wikipedia.org/wiki/Intersecci%C3%B3n_de_conjuntos) de dos conjuntos A y B es el conjunto $A \\cap B$ que contiene todos los elementos comunes de A y B.\n", "\n", "\n", "* **Diferencia**. La [diferencia](https://es.wikipedia.org/wiki/Diferencia_de_conjuntos) entre dos conjuntos A y B es el conjunto $A \\setminus B$ que contiene todos los elementos de A que no pertenecen a B.\n", "\n", "\n", "* **Complemento**. El [complemento](https://es.wikipedia.org/wiki/Complemento_de_un_conjunto) de un conjunto A es el conjunto $A^∁$ que contiene todos los elementos que no pertenecen a A.\n", "\n", "\n", "* **Producto cartesiano**. El [producto cartesiano](https://es.wikipedia.org/wiki/Producto_cartesiano) de dos conjuntos A y B es el conjunto $A \\times B$ que contiene todos los pares ordenados (a, b) cuyo primer elemento pertenece a A y su segundo elemento pertenece a B.\n", "\n", "\n", "## Conjuntos con Python\n", "\n", "Luego de todo este repaso por los fundamentos de la [teoría de conjuntos](https://es.wikipedia.org/wiki/Teor%C3%ADa_de_conjuntos), es tiempo de ver como podemos utilizar a los [conjuntos](https://es.wikipedia.org/wiki/Conjunto) dentro de [Python](https://www.python.org/); ya que el lenguaje trae como una de sus [estructuras de datos](https://es.wikipedia.org/wiki/Estructura_de_datos) por defecto a los [conjuntos](https://es.wikipedia.org/wiki/Conjunto). También veremos que podemos utilizar el *constructor* `FiniteSet` que nos proporciona [sympy](http://www.sympy.org/es/), el cual tiene ciertas ventajas sobre la versión por defecto de [Python](https://www.python.org/)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{1, 2, 3}" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Creando un conjunto en python\n", "A = {1,2,3}\n", "A" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{'bananas', 'limones', 'manzanas', 'naranjas'}" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Creando un conjunto a partir de una lista\n", "lista = [\"bananas\", \"manzanas\", \"naranjas\", \"limones\"]\n", "B = set(lista)\n", "B" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{'bananas', 'limones', 'manzanas', 'naranjas'}" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Los conjuntos eliminan los elementos duplicados\n", "lista = [\"bananas\", \"manzanas\", \"naranjas\", \"limones\",\n", " \"bananas\", \"bananas\", \"limones\", \"naranjas\"]\n", "B = set(lista)\n", "B" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "set()" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Creando el conjunto vacío\n", "O = set()\n", "O" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "La cardinalidad del conjunto A = {1, 2, 3} es 3\n" ] } ], "source": [ "# Cardinalidad de un conjunto con len().\n", "print(\"La cardinalidad del conjunto A = {0} es {1}\".format(A,len(A)))" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# comprobando membresía\n", "2 in A" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Igualdad entre conjuntos. El orden de los elementos no importa.\n", "A = {1,2,3,4}\n", "B = {4,2,3,1}\n", "A == B " ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Subconjunto. No hay distincion entre subconjunto y propio\n", "# para el conjunto por defecto de python.\n", "A = {1,2,3}\n", "B = {1,2,3,4,5}\n", "A.issubset(B)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Subconjunto propio\n", "A.issubset(B) and A != B" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Union de conjuntos\n", "A = {1,2,3,4,5}\n", "B = {4,5,6,7,8,9,10}\n", "A.union(B)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{4, 5}" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Intersección de conjuntos\n", "A.intersection(B)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{1, 2, 3}" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Diferencia entre conjuntos\n", "A - B" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{6, 7, 8, 9, 10}" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "B - A" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{1, 2, 3}" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Utilizando FiniteSet de sympy\n", "from sympy import FiniteSet\n", "C = FiniteSet(1, 2, 3)\n", "C" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{EmptySet(), {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}}" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Generando el conjunto potencia. Esto no se puede\n", "# hacer utilizando el conjunto por defecto de python.\n", "C.powerset()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "La cardinalidad del conjunto potencia del conjunto C = {1, 2, 3} es 8\n" ] } ], "source": [ "# Cardinalidad\n", "print(\"La cardinalidad del conjunto potencia del conjunto C = {0} es {1}\".\n", " format(C, len(C.powerset())))" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Igualdad\n", "A = FiniteSet(1, 2, 3)\n", "B = FiniteSet(1, 3, 2)\n", "A == B" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A = FiniteSet(1, 2, 3)\n", "B = FiniteSet(1, 3, 4)\n", "A == B" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Subconjunto y subconjunto propio\n", "A = FiniteSet(1,2,3)\n", "B = FiniteSet(1,2,3,4,5)\n", "A.is_subset(B)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A.is_proper_subset(B)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# A == B. El test de subconjunto propio da falso\n", "B = FiniteSet(2,1,3)\n", "A.is_proper_subset(B)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{1, 2, 3, 4, 6}" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Union de dos conjuntos\n", "A = FiniteSet(1, 2, 3)\n", "B = FiniteSet(2, 4, 6)\n", "A.union(B)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{2}" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Interseccion de dos conjuntos\n", "A = FiniteSet(1, 2) \n", "B = FiniteSet(2, 3) \n", "A.intersect(B)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{1}" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Diferencia entre conjuntos\n", "A - B" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{1, 2} x {3, 4}" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Calculando el producto cartesiano. Con el conjunto por \n", "# defecto de python no podemos hacer esto con el operador *\n", "A = FiniteSet(1, 2)\n", "B = FiniteSet(3, 4)\n", "P = A * B\n", "P" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1, 3)\n", "(1, 4)\n", "(2, 3)\n", "(2, 4)\n" ] } ], "source": [ "for elem in P:\n", " print(elem)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{1, 2, 3, 4} x {1, 2, 3, 4}" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Elevar a la n potencia un conjunto. Calcula el n \n", "# producto cartesiano del mismo conjunto.\n", "A = FiniteSet(1, 2, 3, 4)\n", "P2 = A ** 2\n", "P2" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{1, 2, 3, 4} x {1, 2, 3, 4} x {1, 2, 3, 4}" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "P3 = A ** 3\n", "P3" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1, 1, 1)\n", "(1, 1, 2)\n", "(1, 1, 3)\n", "(1, 1, 4)\n", "(1, 2, 1)\n", "(1, 2, 2)\n", "(1, 2, 3)\n", "(1, 2, 4)\n", "(1, 3, 1)\n", "(1, 3, 2)\n", "(1, 3, 3)\n", "(1, 3, 4)\n", "(1, 4, 1)\n", "(1, 4, 2)\n", "(1, 4, 3)\n", "(1, 4, 4)\n", "(2, 1, 1)\n", "(2, 1, 2)\n", "(2, 1, 3)\n", "(2, 1, 4)\n", "(2, 2, 1)\n", "(2, 2, 2)\n", "(2, 2, 3)\n", "(2, 2, 4)\n", "(2, 3, 1)\n", "(2, 3, 2)\n", "(2, 3, 3)\n", "(2, 3, 4)\n", "(2, 4, 1)\n", "(2, 4, 2)\n", "(2, 4, 3)\n", "(2, 4, 4)\n", "(3, 1, 1)\n", "(3, 1, 2)\n", "(3, 1, 3)\n", "(3, 1, 4)\n", "(3, 2, 1)\n", "(3, 2, 2)\n", "(3, 2, 3)\n", "(3, 2, 4)\n", "(3, 3, 1)\n", "(3, 3, 2)\n", "(3, 3, 3)\n", "(3, 3, 4)\n", "(3, 4, 1)\n", "(3, 4, 2)\n", "(3, 4, 3)\n", "(3, 4, 4)\n", "(4, 1, 1)\n", "(4, 1, 2)\n", "(4, 1, 3)\n", "(4, 1, 4)\n", "(4, 2, 1)\n", "(4, 2, 2)\n", "(4, 2, 3)\n", "(4, 2, 4)\n", "(4, 3, 1)\n", "(4, 3, 2)\n", "(4, 3, 3)\n", "(4, 3, 4)\n", "(4, 4, 1)\n", "(4, 4, 2)\n", "(4, 4, 3)\n", "(4, 4, 4)\n" ] } ], "source": [ "for elem in P3:\n", " print(elem)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# graficos embebidos\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nGYloNUgChOcAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Dibujanto el diagrama de venn de 2 conjuntos\n", "from matplotlib_venn import venn2, venn2_circles\n", "import matplotlib.pyplot as plt\n", " \n", "A = FiniteSet(1, 3, 5, 7, 9, 11, 13, 15, 17, 19)\n", "B = FiniteSet(2, 3, 5, 7, 11, 13, 17, 19, 8)\n", "\n", "plt.figure(figsize=(6, 8))\n", "v = venn2(subsets=[A, B], set_labels=('A', 'B'))\n", "v.get_label_by_id('10').set_text(A - B)\n", "v.get_label_by_id('11').set_text(A.intersection(B))\n", "v.get_label_by_id('01').set_text(B - A)\n", "c = venn2_circles(subsets=[A, B], linestyle='dashed')\n", "c[0].set_ls('solid')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Además de las aplicaciones que pueden tener los [conjuntos](https://es.wikipedia.org/wiki/Conjunto) de [Python](https://www.python.org/) en matemáticas, los mismos también pueden ser una [estructura de datos](https://es.wikipedia.org/wiki/Estructura_de_datos) poderosa y ayudarnos a resolver varios problemas de programación en forma muy sencilla. A tenerlos en cuenta!\n", "\n", "Con esto termino este artículo; espero que les haya gustado y les sea de utilidad." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Saludos!\n", "\n", "*Este post fue escrito utilizando IPython notebook. Pueden descargar este [notebook](https://github.com/relopezbriega/relopezbriega.github.io/blob/master/downloads/pythonSets.ipynb) o ver su version estática en [nbviewer](http://nbviewer.ipython.org/github/relopezbriega/relopezbriega.github.io/blob/master/downloads/pythonSets.ipynb).*" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.4.3+" } }, "nbformat": 4, "nbformat_minor": 0 }