duda sobre listas por comprension o listas autodefinidas o como se llamen

Kike Cabrera kikecalpe en gmail.com
Mar Feb 12 15:10:44 CET 2008


>
> Date: Sun, 10 Feb 2008 17:59:51 +1930
> From: "Francisco Palm" <francisco.palm en gmail.com>
> Subject: Re: [Python-es] duda sobre listas por comprension o listas
>         autodefinidas o como se llamen
> To: " Lista de discusión sobre python en castellano "
>         <python-es en aditel.org>
> Message-ID:
>         <c4ae52b10802091429t5c000051x13701aaa91f3cbcf en mail.gmail.com>
> Content-Type: text/plain; charset=ISO-8859-1
>
> El 10/02/08, Kike Cabrera <kikecalpe en gmail.com> escribió:
> > no sirve para tuplas de mas de tres elementos, puesto que en vez de
> hacer
> > grupos de tuplas con mas de 2 diferencias, hace grupos con tan solo dos
> > tuplas, tal y como se puede ver a continuacion.
> >
> > >>> combinacion
> > [('1', '1', '1', '1'), ('1', '1', '1', 'x'), ('1', '1', 'x', '1'), ('1',
> > '1', 'x', 'x'), ('1', 'x', '1', '1'), ('1', 'x', '1', 'x'), ('1', 'x',
> 'x',
> > '1'), ('1', 'x', 'x', 'x'), ('x', '1', '1', '1'), ('x', '1', '1', 'x'),
> > ('x', '1', 'x', '1'), ('x', '1', 'x', 'x'), ('x', 'x', '1', '1'), ('x',
> 'x',
> > '1', 'x'), ('x', 'x', 'x', '1'), ('x', 'x', 'x', 'x')]
> > >>> combinaciones = [(x,y) for x in combinacion for y in combinacion if
> > compara(x,y)>2]
>
> Claro!, porque según esta lista estás generando tuplas de dos
> elementos -> (x,y), no puedes obtener algo diferente, tendrías que
> generalizar el algoritmo de alguna manera.
>
> Fijate que el primer elemento de cada tupla se repite, así que podemos
> usar ese elemento como índice de un diccionario.
>
> Primero lo de Chema
>
> >>> def ndiff(a,b):
> ...     return sum(1 for (i,j) in zip(a,b) if i<>j)
> ...
> >>> combinacion =  [('1', '1', '1', '1'), ('1', '1', '1', 'x'), ('1',
> '1', 'x', '1'), ('1', '1', 'x', 'x'), ('1', 'x', '1', '1'), ('1', 'x',
> '1', 'x'), ('1', 'x', 'x', '1'), ('1', 'x', 'x', 'x'), ('x', '1', '1',
> '1'), ('x', '1', '1', 'x'), ('x', '1', 'x', '1'), ('x', '1', 'x',
> 'x'), ('x', 'x', '1', '1'), ('x', 'x', '1', 'x'), ('x', 'x', 'x',
> '1'), ('x', 'x', 'x', 'x')]
> >>>
> >>> combinaciones = [ (x,y) for x in combinacion for y in combinacion
> if ndiff(x,y) > 2]
>
> Y después construimos el diccionario
>
> >>> dic = {}
> >>> for elem in combinacion:
> ...     dic[elem] = [elem]
> ...
> >>> for k, v in combinaciones:
> ...     dic[k].append(v)
> ...
> >>> dic.values()
> [[('1', '1', 'x', '1'), ('1', 'x', '1', 'x'), ('x', '1', '1', 'x'),
> ('x', 'x', '1', '1'), ('x', 'x', '1', 'x'), ('x', 'x', 'x', 'x')],
> [('1', 'x', '1', 'x'), ('1', '1', 'x', '1'), ('x', '1', '1', '1'),
> ('x', '1', 'x', '1'), ('x', '1', 'x', 'x'), ('x', 'x', 'x', '1')],
> ...
> [('x', '1', '1', 'x'), ('1', '1', 'x', '1'), ('1', 'x', '1', '1'),
> ('1', 'x', 'x', '1'), ('1', 'x', 'x', 'x'), ('x', 'x', 'x', '1')]]
> >>>
>
> No sé si es lo que quieres exactamente, quizás sería interesante
> plantear un "dictionary comprehension" más universal:
> http://www.python.org/dev/peps/pep-0274/


Por lo que veo no me cuadra, pero si que me puede interesar hacer algo
parecido a lo que dices, gracias por tu ayuda.


Saludos
>
> F. Palm
>
> --
> Date: Sun, 10 Feb 2008 04:03:04 +0100
> From: Chema Cortes <py en ch3m4.org>
> Subject: Re: [Python-es] duda sobre listas por comprension o listas
>         autodefinidas o como se llamen
> To: Lista de discusión sobre python en castellano
>         <python-es en aditel.org>
> Message-ID: <200802100403.12815.py en ch3m4.org>
> Content-Type: text/plain; charset="utf-8"
>
> El Saturday 09 February 2008 21:40:14 Kike Cabrera escribió:
> > > El 6/02/08, Chema Cortes <py en ch3m4.org> escribió:
> > > > En cuanto a agrupar tuplas según el número de diferencias entre
> sí, no
> > > > es una
> > > > propiedad "transitiva", luego no es posible crear equivalencias.
> ¿Estás
> > > > seguro de que es lo que buscas?
> >
> > ¿que quieres decir con propiedad ' transitiva'? ¿crear equivalencias?
> ¿de
> > que?
> > estoy segurisimo de lo que busco, no estoy seguro sin embargo que con
> > listas autodefinidas sea la manera correcta de hacerlo.
>
> Digamos que los grupos que estás creando son lo que se denomina "clases
> de
> equivalencia" tomando como relación de equivalencia el "número de
> diferencias" entre tuplas, relación que no cumple la propiedad
> transitiva.
>


Lo que necesito es agrupar las tuplas que entre si cumplen la relacion de
equivalencia, incluida la propiedad transitiva, en un mismo grupo,
consiguiendo asi varios grupos. Las tuplas que no cumplen la relacion con
las tuplas del grupo 1 la cumplirán con las de otro grupo, sea el que sea.
¿El primer ejemplo no cumplia la relacion de equivalencia?
otro ejemplo mas complicado:
>>> lista = ['1','x']
>>> ap = [[a,b,c,d,e,f,g] for a in lista for b in lista for c in lista for d
in lista for e in lista for f in lista for g in lista]
>>> ap
[['1', '1', '1', '1', '1', '1', '1'], ['1', '1', '1', '1', '1', '1', 'x'],
['1', '1', '1', '1', '1', 'x', '1'],
['1', '1', '1', '1', '1', 'x', 'x'], ['1', '1', '1', '1', 'x', '1', '1'],
['1', '1', '1', '1', 'x', '1', 'x'],
...
['x', 'x', 'x', 'x', '1', 'x', '1'], ['x', 'x', 'x', 'x', '1', 'x', 'x'],
['x', 'x', 'x', 'x', 'x', '1', '1'],
['x', 'x', 'x', 'x', 'x', '1', 'x'], ['x', 'x', 'x', 'x', 'x', 'x', '1'],
['x', 'x', 'x', 'x', 'x', 'x', 'x']]

los grupos tendrian que ser algo así (en este caso habría ocho grupos).
>>> grupo0
[('1', '1', '1', '1', '1', '1', '1'), ('1', '1', '1', '1', 'x', 'x', 'x'),
('1', '1', 'x', 'x', '1', '1', 'x'),
('1', '1', 'x', 'x', 'x', 'x', '1'), ('1', 'x', '1', 'x', '1', 'x', '1'),
('1', 'x', '1', 'x', 'x', '1', 'x'),
('1', 'x', 'x', '1', '1', 'x', 'x'), ('1', 'x', 'x', '1', 'x', '1', '1'),
('x', '1', '1', 'x', '1', 'x', 'x'),
('x', '1', '1', 'x', 'x', '1', '1'), ('x', '1', 'x', '1', '1', 'x', '1'),
('x', '1', 'x', '1', 'x', '1', 'x'),
('x', 'x', '1', '1', '1', '1', 'x'), ('x', 'x', '1', '1', 'x', 'x', '1'),
('x', 'x', 'x', 'x', '1', '1', '1'),
('x', 'x', 'x', 'x', 'x', 'x', 'x')]
>>> grupo1
[('1', '1', '1', '1', '1', '1', 'x'), ('1', '1', '1', '1', 'x', 'x', '1'),
('1', '1', 'x', 'x', '1', '1', '1'),
('1', '1', 'x', 'x', 'x', 'x', 'x'), ('1', 'x', '1', 'x', '1', 'x', 'x'),
('1', 'x', '1', 'x', 'x', '1', '1'),
('1', 'x', 'x', '1', '1', 'x', '1'), ('1', 'x', 'x', '1', 'x', '1', 'x'),
('x', '1', '1', 'x', '1', 'x', '1'),
 ('x', '1', '1', 'x', 'x', '1', 'x'), ('x', '1', 'x', '1', '1', 'x', 'x'),
('x', '1', 'x', '1', 'x', '1', '1'),
('x', 'x', '1', '1', '1', '1', '1'), ('x', 'x', '1', '1', 'x', 'x', 'x'),
('x', 'x', 'x', 'x', '1', '1', 'x'),
('x', 'x', 'x', 'x', 'x', 'x', '1')]

Gracias a ambos por vuestra ayuda.
Esto forma parte de un programa sobre quinielas (apuestas en España sobre
fútbol) que estoy llevando a cabo para aprender sobre python, ni que decir
tiene que antes no tenía ni idea de programar.
Si quereis consultar las características de las reducciones en la quiniela
podeis leer más info en la página de
jagar<http://club.telepolis.com/jagar1/Reducciones1.htm>o en otra
de la ONLAE <http://onlae.terra.es/1x2/reducidaso/gruposclaves.htm>.
Si quereis ver como se encuentra el desarrollo del programa podeis consultar
en el este enlace<http://www.losersjuegos.com.ar/foro/viewtopic.php?p=891#891>,
donde podréis ver el apaño que he hecho sobre esto que he estado
consultando.
Un saludo y otra vez gracias
------------ próxima parte ------------
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes


Más información sobre la lista de distribución Python-es