[Python-es] duda sobre listas por comprension o listas
autodefinidas o como se llamen
Francisco Palm
francisco.palm en gmail.com
Sab Feb 9 23:29:51 CET 2008
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/
Saludos
F. Palm
--
--------------------------------------
fpalm en ula.ve
francisco.palm en gmail.com
cel: 0414 5109177
tel: 0274 6352001
----
Yo creo que todavía no es demasiado tarde para construir una utopía
que nos permita compartir la tierra. Gabriel García Márquez.
Más información sobre la lista de distribución Python-es