[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