Discussion:
Problema interesante: el anti-string
Roberto Alsina
2010-08-04 18:51:47 UTC
Permalink
Buenas, tengo un problema interesante.

Dado una lista de strings S1,S2...SN , producir una lista X1,X2,...XN que al
ordenarla alfabéticamente ordene **al revés** que la original.

O sea, si tengo

S1, X1
S2, X2
:
:
SN, XN

Quiero que si ordeno por la primera columna, S1, S2... SN queden en orden
alfabético creciente, y si ordeno en orden alfabético creciente por la
segunda, queden exactamente al revés.

Se entiende?
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Martin Cerdeira
2010-08-04 18:52:20 UTC
Permalink
Post by Roberto Alsina
Buenas, tengo un problema interesante.
Dado una lista de strings S1,S2...SN , producir una lista X1,X2,...XN que al
ordenarla alfabéticamente ordene **al revés** que la original.
O sea, si tengo
S1, X1
S2, X2
SN, XN
Quiero que si ordeno por la primera columna, S1, S2... SN queden en orden
alfabético creciente, y si ordeno en orden alfabético creciente por la
segunda, queden exactamente al revés.
Se entiende?
Yo no entendí.

La entrada es S1,S2... y la salida es X1,X2??


-------------------------------------
Martín Cerdeira - Software Developer
[web] http://www.codmacs.blogspot.com/
() ascii ribbon campaign
/\ www.asciiribbon.org
Roberto Alsina
2010-08-04 18:59:07 UTC
Permalink
Post by Roberto Alsina
Buenas, tengo un problema interesante.
Dado una lista de strings S1,S2...SN , producir una lista X1,X2,...XN que
al ordenarla alfabéticamente ordene **al revés** que la original.
O sea, si tengo
S1, X1
S2, X2
SN, XN
Quiero que si ordeno por la primera columna, S1, S2... SN queden en orden
alfabético creciente, y si ordeno en orden alfabético creciente por la
segunda, queden exactamente al revés.
Se entiende?
Yo no entendí.
La entrada es S1,S2... y la salida es X1,X2??
Sí. Pensá en X1, X2... como el "negativo" de S1, S2...

Por ejemplo, si quisiera hacer esto con enteros es trivial:

[-i for i in lista]

y ya está, la lista ordena exactamente al revés. Con strings... no es tan
trivial :-)
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Martin Cerdeira
2010-08-04 19:00:42 UTC
Permalink
Post by Roberto Alsina
Buenas, tengo un problema interesante.
Post by Roberto Alsina
Dado una lista de strings S1,S2...SN , producir una lista X1,X2,...XN que al
ordenarla alfabéticamente ordene **al revés** que la original.
O sea, si tengo
S1, X1
S2, X2
SN, XN
Quiero que si ordeno por la primera columna, S1, S2... SN queden en orden
alfabético creciente, y si ordeno en orden alfabético creciente por la
segunda, queden exactamente al revés.
Se entiende?
Yo no entendí.
La entrada es S1,S2... y la salida es X1,X2??
-------------------------------------
Martín Cerdeira - Software Developer
[web] http://www.codmacs.blogspot.com/
() ascii ribbon campaign
/\ www.asciiribbon.org
Post by Roberto Alsina
a = ["hola","aa","gg"]
a.sort()
a
['aa', 'gg', 'hola']
Post by Roberto Alsina
Post by Roberto Alsina
a.reverse()
a
['hola', 'gg', 'aa']
Eso no sirve? (sigo pensando que no entendí tu consigna)
-------------------------------------
Martín Cerdeira - Software Developer
[web] http://www.codmacs.blogspot.com/
() ascii ribbon campaign
/\ www.asciiribbon.org
Roberto Alsina
2010-08-04 19:07:41 UTC
Permalink
Post by Martin Cerdeira
a = ["hola","aa","gg"]
a.sort()
a
['aa', 'gg', 'hola']
a.reverse()
a
['hola', 'gg', 'aa']
Eso no sirve? (sigo pensando que no entendí tu consigna)
Sí, sirve, pero... no lo puedo usar en el caso específico que tengo porque se
pueden insertar cosas después y tienen que ir al lugar correcto.

Es mas complicado que esto, pero imaginate que tenes un widget lista de dos
columnas que siempre ordena en orden creciente por una columna.

Podes elegir por cual columna ordena, pero no le podes decir que ordene en
forma decreciente. Pero **querés** que se vean en forma decreciente por la
primera columna.

Entonces, yo podría poner las anti-strings en la segunda columna y decirle que
ordene por ahí, y la primera columna (con los strings originales) quedaría
decreciente.

_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Marcelo Rinesi
2010-08-04 19:15:56 UTC
Permalink
Post by Roberto Alsina
Entonces, yo podría poner las anti-strings en la segunda columna y decirle que
ordene por ahí, y la primera columna (con los strings originales) quedaría
decreciente.
Algo tipo esto? (ignorá el import poco eficientemente ubicado, y que
es solo para strings lowercase, la extensión al caso general es
directa)

def antistring(str):
def antichar(c):
import string
lowercase = string.lowercase
n = lowercase.index(c)+1
return lowercase[len(lowercase)-n]

return ''.join(antichar(c) for c in str)

Un testeo rápido de unos cientos de casos me dá que funciona, pero por
supuesto nada testeó mi testeo :).
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Facundo Batista
2010-08-04 20:20:27 UTC
Permalink
Post by Roberto Alsina
Es mas complicado que esto, pero imaginate que tenes un widget lista de dos
columnas que siempre ordena en orden creciente por una columna.
Podes elegir por cual columna ordena, pero no le podes decir que ordene en
forma decreciente. Pero **querés** que se vean en forma decreciente por la
primera columna.
Entonces, yo podría poner las anti-strings en la segunda columna y decirle que
ordene por ahí, y la primera columna (con los strings originales) quedaría
decreciente.
inicial = ["foo", "bar", "doh", "otro", u"más"]
cols = [sorted(inicial, reverse=True), sorted(inicial)]
cols
[['otro', u'm\xe1s', 'foo', 'doh', 'bar'], ['bar', 'doh', 'foo',
u'm\xe1s', 'otro']]
Post by Roberto Alsina
nueva = "nueva"
pos = bisect.bisect(cols[1], nueva)
cols[0].insert(-pos, nueva)
cols[1].insert(pos, nueva)
cols
[['otro', 'nueva', u'm\xe1s', 'foo', 'doh', 'bar'], ['bar', 'doh',
'foo', u'm\xe1s', 'nueva', 'otro']]

Slds.
--
.    Facundo

Blog: http://www.taniquetil.com.ar/plog/
PyAr: http://www.python.org/ar/
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
gustavo carmona
2010-08-05 11:49:12 UTC
Permalink
Post by Roberto Alsina
Post by Martin Cerdeira
a = ["hola","aa","gg"]
a.sort()
a
['aa', 'gg', 'hola']
a.reverse()
a
['hola', 'gg', 'aa']
Eso no sirve? (sigo pensando que no entendí tu consigna)
Sí, sirve, pero... no lo puedo usar en el caso específico que tengo porque se
pueden insertar cosas después y tienen que ir al lugar correcto.
Es mas complicado que esto, pero imaginate que tenes un widget lista de dos
columnas que siempre ordena en orden creciente por una columna.
Podes elegir por cual columna ordena, pero no le podes decir que ordene en
forma decreciente. Pero **querés** que se vean en forma decreciente por la
primera columna.
Entonces, yo podría poner las anti-strings en la segunda columna y decirle que
ordene por ahí, y la primera columna (con los strings originales) quedaría
decreciente.
otro truco python
Post by Roberto Alsina
Post by Martin Cerdeira
a = ["basket","ball","complex","manu"]
a[::-1]
['manu', 'complex', 'ball', 'basket']
El problema es que la consulta viene de Roberto Alsina, y como la tiene
bastante clara, no se como ayudar a Roberto.

--
Gustavo C
aka p8queen
desde mutt

_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
gustavo carmona
2010-08-05 11:44:57 UTC
Permalink
Post by Martin Cerdeira
Post by Roberto Alsina
Buenas, tengo un problema interesante.
Post by Roberto Alsina
Dado una lista de strings S1,S2...SN , producir una lista X1,X2,...XN que al
ordenarla alfabéticamente ordene **al revés** que la original.
O sea, si tengo
S1, X1
S2, X2
SN, XN
Quiero que si ordeno por la primera columna, S1, S2... SN queden en orden
alfabético creciente, y si ordeno en orden alfabético creciente por la
segunda, queden exactamente al revés.
Se entiende?
Yo no entendí.
La entrada es S1,S2... y la salida es X1,X2??
-------------------------------------
Martín Cerdeira - Software Developer
[web] http://www.codmacs.blogspot.com/
() ascii ribbon campaign
/\ www.asciiribbon.org
Post by Roberto Alsina
a = ["hola","aa","gg"]
a.sort()
a
['aa', 'gg', 'hola']
Post by Roberto Alsina
Post by Roberto Alsina
a.reverse()
a
['hola', 'gg', 'aa']
Eso no sirve? (sigo pensando que no entendí tu consigna)
Como viene de Roberto Alsina la pregunta, supongo que eso no lo ayuda.
Sigo leyendo los e-mails.

--
Gustavo C
aka p8queen
desde mutt


_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Martin Cerdeira
2010-08-05 17:47:19 UTC
Permalink
Post by gustavo carmona
Post by Martin Cerdeira
Post by Roberto Alsina
Buenas, tengo un problema interesante.
Post by Roberto Alsina
Dado una lista de strings S1,S2...SN , producir una lista X1,X2,...XN
que
Post by Martin Cerdeira
Post by Roberto Alsina
Post by Roberto Alsina
al
ordenarla alfabéticamente ordene **al revés** que la original.
O sea, si tengo
S1, X1
S2, X2
SN, XN
Quiero que si ordeno por la primera columna, S1, S2... SN queden en
orden
Post by Martin Cerdeira
Post by Roberto Alsina
Post by Roberto Alsina
alfabético creciente, y si ordeno en orden alfabético creciente por la
segunda, queden exactamente al revés.
Se entiende?
Yo no entendí.
La entrada es S1,S2... y la salida es X1,X2??
-------------------------------------
Martín Cerdeira - Software Developer
[web] http://www.codmacs.blogspot.com/
() ascii ribbon campaign
/\ www.asciiribbon.org
Post by Roberto Alsina
a = ["hola","aa","gg"]
a.sort()
a
['aa', 'gg', 'hola']
Post by Roberto Alsina
Post by Roberto Alsina
a.reverse()
a
['hola', 'gg', 'aa']
Eso no sirve? (sigo pensando que no entendí tu consigna)
Como viene de Roberto Alsina la pregunta, supongo que eso no lo ayuda.
Sigo leyendo los e-mails.
--
Gustavo C
aka p8queen
desde mutt
Si, yo supuse lo mismo. Pero, fue una forma de re-preguntar, usando mi
ejemplo *tonto*.
Como bien dijiste, a leer el resto del hilo.
Saludos

-------------------------------------
Martín Cerdeira - Software Developer
[web] http://www.codmacs.blogspot.com/
() ascii ribbon campaign
/\ www.asciiribbon.org
Roberto Alsina
2010-08-04 19:03:02 UTC
Permalink
Post by Roberto Alsina
Buenas, tengo un problema interesante.
Dado una lista de strings S1,S2...SN , producir una lista X1,X2,...XN que
al ordenarla alfabéticamente ordene **al revés** que la original.
O sea, si tengo
S1, X1
S2, X2
SN, XN
Quiero que si ordeno por la primera columna, S1, S2... SN queden en orden
alfabético creciente, y si ordeno en orden alfabético creciente por la
segunda, queden exactamente al revés.
Se entiende?
_______________________________________________
http://listas.python.org.ar/listinfo/pyar
PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Forma más fácil del problema:

Dado un string S, crear una funcion f tal que S1>S2 => f(S1) < f(S2)

Ahí creo que es más claro :-)
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
John Rowland Lenton
2010-08-04 19:11:23 UTC
Permalink
Post by Roberto Alsina
Post by Roberto Alsina
Buenas, tengo un problema interesante.
Dado una lista de strings S1,S2...SN , producir una lista X1,X2,...XN que
al ordenarla alfabéticamente ordene **al revés** que la original.
O sea, si tengo
S1, X1
S2, X2
SN, XN
Quiero que si ordeno por la primera columna, S1, S2... SN queden en orden
alfabético creciente, y si ordeno en orden alfabético creciente por la
segunda, queden exactamente al revés.
Se entiende?
_______________________________________________
http://listas.python.org.ar/listinfo/pyar
PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Dado un string S, crear una funcion f tal que S1>S2 => f(S1) < f(S2)
Ahí creo que es más claro :-)
-hash(s) ?
John Rowland Lenton
2010-08-04 19:11:49 UTC
Permalink
Post by John Rowland Lenton
-hash(s) ?
bolazo, ignore.
Pablo Ziliani
2010-08-04 19:17:40 UTC
Permalink
Post by Roberto Alsina
Dado un string S, crear una funcion f tal que S1>S2 => f(S1) < f(S2)
o sea, algo así pero donde a[1] sea un caracter razonable, no?
Post by Roberto Alsina
a = ['papa', 'foo', 'pepe', 'bar', 'python']
m = ord(max(''.join(a)))
b = [(i, ''.join(chr(m - ord(j)) for j in i)) for i in a]
b
[('papa', '\t\x18\t\x18'), ('foo', '\x13\n\n'), ('pepe',
'\t\x14\t\x14'), ('bar', '\x17\x18\x07'), ('python',
'\t\x00\x05\x11\n\x0b')]
Post by Roberto Alsina
sorted(b, key=lambda x:x[0])
[('bar', '\x17\x18\x07'), ('foo', '\x13\n\n'), ('papa', '\t\x18\t\x18'),
('pepe', '\t\x14\t\x14'), ('python', '\t\x00\x05\x11\n\x0b')]
Post by Roberto Alsina
sorted(b, key=lambda x:x[1])
[('python', '\t\x00\x05\x11\n\x0b'), ('pepe', '\t\x14\t\x14'), ('papa',
'\t\x18\t\x18'), ('foo', '\x13\n\n'), ('bar', '\x17\x18\x07')]

_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Roberto Alsina
2010-08-04 19:31:20 UTC
Permalink
Post by Pablo Ziliani
Post by Roberto Alsina
Dado un string S, crear una funcion f tal que S1>S2 => f(S1) < f(S2)
o sea, algo así pero donde a[1] sea un caracter razonable, no?
Post by Roberto Alsina
a = ['papa', 'foo', 'pepe', 'bar', 'python']
m = ord(max(''.join(a)))
b = [(i, ''.join(chr(m - ord(j)) for j in i)) for i in a]
b
[('papa', '\t\x18\t\x18'), ('foo', '\x13\n\n'), ('pepe',
'\t\x14\t\x14'), ('bar', '\x17\x18\x07'), ('python',
'\t\x00\x05\x11\n\x0b')]
Post by Roberto Alsina
sorted(b, key=lambda x:x[0])
[('bar', '\x17\x18\x07'), ('foo', '\x13\n\n'), ('papa', '\t\x18\t\x18'),
('pepe', '\t\x14\t\x14'), ('python', '\t\x00\x05\x11\n\x0b')]
Post by Roberto Alsina
sorted(b, key=lambda x:x[1])
[('python', '\t\x00\x05\x11\n\x0b'), ('pepe', '\t\x14\t\x14'), ('papa',
'\t\x18\t\x18'), ('foo', '\x13\n\n'), ('bar', '\x17\x18\x07')]
Esa es la idea :-D

Funciona con unicode?
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Lucio Torre
2010-08-04 19:32:55 UTC
Permalink
On Wed, Aug 4, 2010 at 4:31 PM, Roberto Alsina
Post by Roberto Alsina
Funciona con unicode?
Lei por ahi que:
"The simplest way to represent all possible Unicode code points is
with a 32 bit number. Most computers today are based on a 32 bit or 64
bit architecture, so this allows computers to manipulate Unicode
values as a whole computer "word" of 32 bits on 32 bit architectures,
or as a half computer "word" of 32 bits on 64 bit architectures."

o sea que la idea funciona.

Lucio
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Roberto Alsina
2010-08-04 19:43:22 UTC
Permalink
Post by Lucio Torre
On Wed, Aug 4, 2010 at 4:31 PM, Roberto Alsina
Post by Roberto Alsina
Funciona con unicode?
"The simplest way to represent all possible Unicode code points is
with a 32 bit number. Most computers today are based on a 32 bit or 64
bit architecture, so this allows computers to manipulate Unicode
values as a whole computer "word" of 32 bits on 32 bit architectures,
or as a half computer "word" of 32 bits on 64 bit architectures."
o sea que la idea funciona.
Pero.... en unicode el orden de los code points no es el orden alfabético :-(
De hecho dos code points pueden tener un orden u otro de acuerdo a tu
localización (LC_COLLATE, supongo) :-(

Igual con que ande para muchos casos me doy por feliz :-)
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Lucio Torre
2010-08-04 19:49:25 UTC
Permalink
On Wed, Aug 4, 2010 at 4:43 PM, Roberto Alsina
Post by Roberto Alsina
Post by Lucio Torre
On Wed, Aug 4, 2010 at 4:31 PM, Roberto Alsina
Post by Roberto Alsina
Funciona con unicode?
"The simplest way to represent all possible Unicode code points is
with a 32 bit number. Most computers today are based on a 32 bit or 64
bit architecture, so this allows computers to manipulate Unicode
values as a whole computer "word" of 32 bits on 32 bit architectures,
or as a half computer "word" of 32 bits on 64 bit architectures."
o sea que la idea funciona.
Pero.... en unicode el orden de los code points no es el orden alfabético :-(
De hecho dos code points pueden tener un orden u otro de acuerdo a tu
localización (LC_COLLATE, supongo) :-(
Igual con que ande para muchos casos me doy por feliz :-)
Se puede hacer para que funcione. El problema es si son posiblemente
infinitos los unicode nomas. Por eso no es tan trivial, pero posible.

Lucio.
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Pablo Ziliani
2010-08-04 19:41:27 UTC
Permalink
Post by Pablo Ziliani
Post by Roberto Alsina
Dado un string S, crear una funcion f tal que S1>S2 => f(S1) < f(S2)
o sea, algo así pero donde a[1] sea un caracter razonable, no?
Post by Roberto Alsina
a = ['papa', 'foo', 'pepe', 'bar', 'python'] >>> m =
ord(max(''.join(a)))
Post by Roberto Alsina
b = [(i, ''.join(chr(m - ord(j)) for j in i)) for i in a]
b
[('papa', '\t\x18\t\x18'), ('foo', '\x13\n\n'), ('pepe',
'\t\x14\t\x14'), ('bar', '\x17\x18\x07'), ('python',
'\t\x00\x05\x11\n\x0b')]
Post by Roberto Alsina
sorted(b, key=lambda x:x[0])
[('bar', '\x17\x18\x07'), ('foo', '\x13\n\n'), ('papa',
'\t\x18\t\x18'), ('pepe', '\t\x14\t\x14'), ('python',
'\t\x00\x05\x11\n\x0b')]
Post by Roberto Alsina
sorted(b, key=lambda x:x[1])
[('python', '\t\x00\x05\x11\n\x0b'), ('pepe', '\t\x14\t\x14'),
('papa', '\t\x18\t\x18'), ('foo', '\x13\n\n'), ('bar', '\x17\x18\x07')]
Post by Roberto Alsina
S1 = [u'papa', u'foo', u'pepe', u'bar', u'python']
chars = sorted(set(''.join(S1)))
antichars = dict(zip(chars, reversed(chars)))
S = [(word, u''.join(antichars[char] for char in word)) for word in S1]
sorted(S, key=lambda x:x[0])
[(u'bar', u'tye'), (u'foo', u'phh'), (u'papa', u'fyfy'), (u'pepe',
u'frfr'), (u'python', u'fabohn')]
Post by Pablo Ziliani
Post by Roberto Alsina
sorted(S, key=lambda x:x[1])
[(u'python', u'fabohn'), (u'pepe', u'frfr'), (u'papa', u'fyfy'),
(u'foo', u'phh'), (u'bar', u'tye')]
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Roberto Alsina
2010-08-04 19:48:15 UTC
Permalink
S1 = [u'papa', u'foo', u'pepe', u'bar', u'python']
chars = sorted(set(''.join(S1)))
antichars = dict(zip(chars, reversed(chars)))
S = [(word, u''.join(antichars[char] for char in word)) for word in
S1] >>> sorted(S, key=lambda x:x[0])
[(u'bar', u'tye'), (u'foo', u'phh'), (u'papa', u'fyfy'), (u'pepe',
u'frfr'), (u'python', u'fabohn')]
sorted(S, key=lambda x:x[1])
[(u'python', u'fabohn'), (u'pepe', u'frfr'), (u'papa', u'fyfy'),
(u'foo', u'phh'), (u'bar', u'tye')]
Interesante :-)

Pero si quiero agregar un nuevo string tengo que regenerar antichars, no?
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Pablo Ziliani
2010-08-04 19:48:36 UTC
Permalink
Post by Roberto Alsina
S1 = [u'papa', u'foo', u'pepe', u'bar', u'python']
chars = sorted(set(''.join(S1)))
antichars = dict(zip(chars, reversed(chars)))
S = [(word, u''.join(antichars[char] for char in word)) for word in
S1] >>> sorted(S, key=lambda x:x[0])
[(u'bar', u'tye'), (u'foo', u'phh'), (u'papa', u'fyfy'), (u'pepe',
u'frfr'), (u'python', u'fabohn')]
sorted(S, key=lambda x:x[1])
[(u'python', u'fabohn'), (u'pepe', u'frfr'), (u'papa', u'fyfy'),
(u'foo', u'phh'), (u'bar', u'tye')]
Interesante :-)
Pero si quiero agregar un nuevo string tengo que regenerar antichars, no?
a no ser que te generes antes un the_worldst_biggest_mega_antichars :)
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Pablo Ziliani
2010-08-04 20:00:22 UTC
Permalink
Post by Pablo Ziliani
Post by Roberto Alsina
S1 = [u'papa', u'foo', u'pepe', u'bar', u'python']
chars = sorted(set(''.join(S1)))
antichars = dict(zip(chars, reversed(chars)))
S = [(word, u''.join(antichars[char] for char in word)) for
word in
S1] >>> sorted(S, key=lambda x:x[0])
[(u'bar', u'tye'), (u'foo', u'phh'), (u'papa', u'fyfy'), (u'pepe',
u'frfr'), (u'python', u'fabohn')]
sorted(S, key=lambda x:x[1])
[(u'python', u'fabohn'), (u'pepe', u'frfr'), (u'papa', u'fyfy'),
(u'foo', u'phh'), (u'bar', u'tye')]
Interesante :-)
Pero si quiero agregar un nuevo string tengo que regenerar antichars, no?
a no ser que te generes antes un the_worldst_biggest_mega_antichars :)
y, si te sirve (y dependiendo como necesites manejar estas excepciones),
podés barajar los caracteres que no fueron definidos reeplazando
antichars[char] por antichars.get(char, default), donde vos decidís qué
peso querés darle a default (seguramente algo bajo, o '?' como maneja
los errores el modo "replace" de str.decode)
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Roberto Alsina
2010-08-04 20:05:55 UTC
Permalink
Post by Pablo Ziliani
Post by Roberto Alsina
S1 = [u'papa', u'foo', u'pepe', u'bar', u'python']
chars = sorted(set(''.join(S1)))
antichars = dict(zip(chars, reversed(chars)))
S = [(word, u''.join(antichars[char] for char in word)) for word in
S1] >>> sorted(S, key=lambda x:x[0])
[(u'bar', u'tye'), (u'foo', u'phh'), (u'papa', u'fyfy'), (u'pepe',
u'frfr'), (u'python', u'fabohn')]
sorted(S, key=lambda x:x[1])
[(u'python', u'fabohn'), (u'pepe', u'frfr'), (u'papa', u'fyfy'),
(u'foo', u'phh'), (u'bar', u'tye')]
Interesante :-)
Pero si quiero agregar un nuevo string tengo que regenerar antichars, no?
a no ser que te generes antes un the_worldst_biggest_mega_antichars :)
Con 16MB tengo el mas grande posible, no? ;-)
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Pablo Ziliani
2010-08-04 20:13:12 UTC
Permalink
Post by Roberto Alsina
Post by Pablo Ziliani
Post by Roberto Alsina
S1 = [u'papa', u'foo', u'pepe', u'bar', u'python']
chars = sorted(set(''.join(S1)))
antichars = dict(zip(chars, reversed(chars)))
S = [(word, u''.join(antichars[char] for char in word)) for word in
S1] >>> sorted(S, key=lambda x:x[0])
[(u'bar', u'tye'), (u'foo', u'phh'), (u'papa', u'fyfy'), (u'pepe',
u'frfr'), (u'python', u'fabohn')]
sorted(S, key=lambda x:x[1])
[(u'python', u'fabohn'), (u'pepe', u'frfr'), (u'papa', u'fyfy'),
(u'foo', u'phh'), (u'bar', u'tye')]
Interesante :-)
Pero si quiero agregar un nuevo string tengo que regenerar antichars, no?
a no ser que te generes antes un the_worldst_biggest_mega_antichars :)
Con 16MB tengo el mas grande posible, no? ;-)
Con una tabla de 16Mb*, es casi seguro que más de una palabra va a
llevar caracteres no-imprimibles o que no son letras. Si aceptás que eso
es así, este algoritmo es demasiado ineficiente. Quizás llegues a una
solución intermedia implementando anticollates® :)


* si te referís a alguna en particular, no entendí
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Roberto Alsina
2010-08-04 20:24:44 UTC
Permalink
Post by Pablo Ziliani
Post by Roberto Alsina
Con 16MB tengo el mas grande posible, no? ;-)
Con una tabla de 16Mb*, es casi seguro que más de una palabra va a
llevar caracteres no-imprimibles o que no son letras.
Claro, es que para hacerla más linda... los strings se bajan de internet, son
títulos de feeds atom/rss
Post by Pablo Ziliani
Si aceptás que eso
es así, este algoritmo es demasiado ineficiente. Quizás llegues a una
solución intermedia implementando anticollates® :)
Igual, me gustó mucho el enfoque :-)
Post by Pablo Ziliani
* si te referís a alguna en particular, no entendí
Decía armar una con todos los codepoints nomás.
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Nhomar Hernández
2010-08-04 20:44:05 UTC
Permalink
Yo todos los dias ordeno cosas ya que trabajo con un ERP..... y este es mi
manual de referencia...

http://wiki.python.org/moin/HowTo/Sorting/#OperatorModuleFunctions

Creas tu metodo que crea en vivo la clave de ordenamiento y listo..... y lo
hago con objetos bien complejos...

Saludos.
Post by Roberto Alsina
Post by Pablo Ziliani
Post by Roberto Alsina
S1 = [u'papa', u'foo', u'pepe', u'bar', u'python']
chars = sorted(set(''.join(S1)))
antichars = dict(zip(chars, reversed(chars)))
S = [(word, u''.join(antichars[char] for char in word)) for word
in
Post by Pablo Ziliani
Post by Roberto Alsina
S1] >>> sorted(S, key=lambda x:x[0])
[(u'bar', u'tye'), (u'foo', u'phh'), (u'papa', u'fyfy'), (u'pepe',
u'frfr'), (u'python', u'fabohn')]
sorted(S, key=lambda x:x[1])
[(u'python', u'fabohn'), (u'pepe', u'frfr'), (u'papa', u'fyfy'),
(u'foo', u'phh'), (u'bar', u'tye')]
Interesante :-)
Pero si quiero agregar un nuevo string tengo que regenerar antichars,
no?
Post by Pablo Ziliani
a no ser que te generes antes un the_worldst_biggest_mega_antichars :)
Con 16MB tengo el mas grande posible, no? ;-)
_______________________________________________
http://listas.python.org.ar/listinfo/pyar
PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Lucio Torre
2010-08-04 19:24:25 UTC
Permalink
Dado un string S, crear una funcion f tal que  S1>S2 => f(S1) < f(S2)
si mapeas cada char a max_char - ord(char) tenes lo que pedis.

Si es para unicode no es tan trivial :)

Lucio.
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
John Rowland Lenton
2010-08-04 19:30:00 UTC
Permalink
Post by Roberto Alsina
Dado un string S, crear una funcion f tal que S1>S2 => f(S1) < f(S2)
Ahí creo que es más claro :-)
si tengo L la lista ordenada de S, entonces

[(s, -i) for (i, s) in enumrate(L)]

sirve.

Si no tenés la ordenada... es más complicado.
Lucio Torre
2010-08-04 19:32:12 UTC
Permalink
Post by John Rowland Lenton
si tengo L la lista ordenada de S, entonces
 [(s, -i) for (i, s) in enumrate(L)]
El problema es que pasa cuando modifica la lista, tiene que reprocesarla toda!

Lucio
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
John Rowland Lenton
2010-08-04 19:34:46 UTC
Permalink
Post by Lucio Torre
Post by John Rowland Lenton
si tengo L la lista ordenada de S, entonces
 [(s, -i) for (i, s) in enumrate(L)]
El problema es que pasa cuando modifica la lista, tiene que reprocesarla toda!
claramente, el crunch me tiene el cerebro frito.

...

Claro, le echo la culpa al crunch.
Roberto Alsina
2010-08-04 19:36:52 UTC
Permalink
Post by John Rowland Lenton
Post by Roberto Alsina
Dado un string S, crear una funcion f tal que S1>S2 => f(S1) < f(S2)
Ahí creo que es más claro :-)
si tengo L la lista ordenada de S, entonces
[(s, -i) for (i, s) in enumrate(L)]
sirve.
Si no tenés la ordenada... es más complicado.
Así la resolví, me gustaría poder hacerlo sin tener la ordenada (mas que nada
para no tener que ordenarla a cada rato)
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Carlos Marcelo Cabrera
2010-08-04 19:42:56 UTC
Permalink
El Wed, 4 Aug 2010 16:03:02 -0300
Post by Roberto Alsina
Dado un string S, crear una funcion f tal que S1>S2 => f(S1) < f(S2)
lamba string: "".join((chr(256 - ord(c)) for c in string))

Espero no sea mucha verdura lo que digo :P
--
/* ************************************************************
Carlos Marcelo Cabrera, alias "Point to null"
Medios de contacto adicionales:
Weblog: http://pointtonull.esdebian.org
Jabber: point_to_null-r/***@public.gmane.org
Yahoo: dxm84ar-/***@public.gmane.org
ICQ: 303014677
************************************************************ */
Roberto Alsina
2010-08-04 20:05:24 UTC
Permalink
Post by Carlos Marcelo Cabrera
El Wed, 4 Aug 2010 16:03:02 -0300
Post by Roberto Alsina
Dado un string S, crear una funcion f tal que S1>S2 => f(S1) < f(S2)
lamba string: "".join((chr(256 - ord(c)) for c in string))
Espero no sea mucha verdura lo que digo :P
Fijate el hilo, estamos con algo parecido, el problema es que la version facil
funciona solo para ASCII y tenemos que soportar unicode :-)
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Federico Heinz
2010-08-04 20:34:07 UTC
Permalink
Post by Roberto Alsina
Fijate el hilo, estamos con algo parecido, el problema es que la
version facil funciona solo para ASCII y tenemos que soportar
unicode :-)
Me parece que está faltando algo en la especificación del problema:
el algoritmo de comparación.

Si mal no recuerdo, la comparación en unicode no tiene nada que ver
con el código específico, sino con la "collating table" que se usa
para un determinado locale. Me suena que sin acceso a esa tabla, no
podemos resolver el problema...

Fede
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Roberto Alsina
2010-08-04 21:02:56 UTC
Permalink
Post by Federico Heinz
Post by Roberto Alsina
Fijate el hilo, estamos con algo parecido, el problema es que la
version facil funciona solo para ASCII y tenemos que soportar
unicode :-)
el algoritmo de comparación.
Si mal no recuerdo, la comparación en unicode no tiene nada que ver
con el código específico, sino con la "collating table" que se usa
para un determinado locale. Me suena que sin acceso a esa tabla, no
podemos resolver el problema...
Suena razonable. Hay de adonde sacar la collating table aunque sea para un
locale?
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Federico Heinz
2010-08-04 21:53:32 UTC
Permalink
Post by Roberto Alsina
Suena razonable. Hay de adonde sacar la collating table aunque sea
para un locale?
De una presentación que encontré en Google[1] saqué que hay una
implementación en Python[2] que usa una tabla publicada por
unicode.org[3].

¿Parece que los locale no entran en el tema, al final de cuentas? Me
llama la atención, porque las funciones de comparación de string
unicode de C dan resultados distintos dependiendo del locale...

Fede

[1] http://developerhappinessdays.googlecode.com/files/unicode.pdf
[2] http://jtauber.com/2006/02/13/pyuca.py
[3] http://www.unicode.org/Public/UCA/latest/allkeys.txt
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
gustavo carmona
2010-08-05 12:09:08 UTC
Permalink
Post by Roberto Alsina
Dado un string S, crear una funcion f tal que S1>S2 => f(S1) < f(S2)
Ahí creo que es más claro :-)
No. :-(
Sea S un conjunto de string, llamemosle s(s chiquito a cada elemento de
S) y f:S-->S :
Para todo (x,y) en S: x>y <==> f(x) < f(y). (Vale para los dos lados)
Igual si nos agarra un matemático, empieza a molestar con las relaciones
de orden y la notación (les gusta aburrir a la gente, a algunos).

Roberto, se entiende tu pregunta, pero como no estoy manejando el
problema en tu lugar, es complicado ayudar.

--
Gustavo C
aka p8queen
desde mutt


_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Roberto Alsina
2010-08-05 12:19:27 UTC
Permalink
Post by gustavo carmona
Post by Roberto Alsina
Dado un string S, crear una funcion f tal que S1>S2 => f(S1) < f(S2)
Ahí creo que es más claro :-)
No. :-(
Sea S un conjunto de string, llamemosle s(s chiquito a cada elemento de
Para todo (x,y) en S: x>y <==> f(x) < f(y). (Vale para los dos lados)
Igual si nos agarra un matemático, empieza a molestar con las relaciones
de orden y la notación (les gusta aburrir a la gente, a algunos).
Estoy asumiendo que S es el conjunto de todos los strings unicode, pero sí,
eso :-)
Post by gustavo carmona
Roberto, se entiende tu pregunta, pero como no estoy manejando el
problema en tu lugar, es complicado ayudar.
Si tengo que explicar todo sale una monografía :-)
La versión corta: es una chancha para ordenar un árbol donde no puedo cambiar
el orden de acuerdo a la "profundidad" a la que estoy, pero quiero que parezca
que sí.
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
John Rowland Lenton
2010-08-05 12:52:31 UTC
Permalink
Post by Roberto Alsina
Dado un string S, crear una funcion f tal que S1>S2 => f(S1) < f(S2)
Ahí creo que es más claro :-)
creo que ya tenés una solución, pero tengo otra (o será la misma? :)

y ambas usan el hecho de que python no ordena por colación (que
depende del locale) sino por el ord() del unicode.

Como siempre, tratándose de unicode, tengo que meter la aclaración de
que si estás comparando cosas, lo primero que tenés que hacer es
normalizar. En particular, me gusta la función de normalización que
hice para el plugin de Ubuntu One para Rhythmbox,

SCRUBBING_RE = re.compile(r"[\W\s]+", re.UNICODE)
CLEANING_RE = re.compile(r"\s+", re.UNICODE)

def normalize(a):
"""Normalize the given string, to increase the chances of a match"""
# rule #0 of unicode mangling: first, normalize
na = unicodedata.normalize('NFKD', a)
# then, strip everything that's not alphanumeric
na = re.sub(SCRUBBING_RE, "", na)
# \w leaves _s
na = na.replace("_", " ")
# then, unify spaces
na = re.sub(CLEANING_RE, " ", na).strip()
# finally, lowercase
na = na.lower()
# if there's anything left, go with that, otherwise rollback
return na if na else a

(© 2010 canonical, licenciado bajo LGPLv3, autor el que suscribe)

pero claro esto es bastante caro, y lo puedo hacer porque sé que no
voy a tener demasiadas cosas para normalizar. Si tuviera muchas,
habría hecho solamente el primer paso (normalización a NFKD); las
normalizaciones que descomponen (NFKD y NFD) son buenísimas para
nosotros, porque ordenan árbol después de az y antes de ba (en vez de
después de zz). Las normalizaciones K llevan ¹ a 1 y º a o, que
también es lo que queremos para ordenar.


Bueno, habiendo dicho eso, una forma de hacer lo que querés sería:

def f(s):
array.array('l', [-ord(i) for i in s])

y otra forma sería:

def f(s):
return "".join(unichr(0x10ffff-ord(i)) for i in s)

la primera usa menos memoria (medida con sys.getsizeof). No he medido
cuál es más rápida. 0x10ffff es el ord más alto de un unicode válido
en pythones más o menos nuevos (no sé cuándo empezó a ser así, pero
hace bastante) (y todavía podés compilar python para que sea más
chico, pero nadie lo hace que yo sepa).
Roberto Alsina
2010-08-05 13:04:14 UTC
Permalink
Post by John Rowland Lenton
Post by Roberto Alsina
Dado un string S, crear una funcion f tal que S1>S2 => f(S1) < f(S2)
Ahí creo que es más claro :-)
creo que ya tenés una solución, pero tengo otra (o será la misma? :)
y ambas usan el hecho de que python no ordena por colación (que
depende del locale) sino por el ord() del unicode.
Como siempre, tratándose de unicode, tengo que meter la aclaración de
que si estás comparando cosas, lo primero que tenés que hacer es
normalizar. En particular, me gusta la función de normalización que
hice para el plugin de Ubuntu One para Rhythmbox,
SCRUBBING_RE = re.compile(r"[\W\s]+", re.UNICODE)
CLEANING_RE = re.compile(r"\s+", re.UNICODE)
"""Normalize the given string, to increase the chances of a
match""" # rule #0 of unicode mangling: first, normalize
na = unicodedata.normalize('NFKD', a)
# then, strip everything that's not alphanumeric
na = re.sub(SCRUBBING_RE, "", na)
# \w leaves _s
na = na.replace("_", " ")
# then, unify spaces
na = re.sub(CLEANING_RE, " ", na).strip()
# finally, lowercase
na = na.lower()
# if there's anything left, go with that, otherwise rollback
return na if na else a
(© 2010 canonical, licenciado bajo LGPLv3, autor el que suscribe)
pero claro esto es bastante caro, y lo puedo hacer porque sé que no
voy a tener demasiadas cosas para normalizar. Si tuviera muchas,
habría hecho solamente el primer paso (normalización a NFKD); las
normalizaciones que descomponen (NFKD y NFD) son buenísimas para
nosotros, porque ordenan árbol después de az y antes de ba (en vez de
después de zz). Las normalizaciones K llevan ¹ a 1 y º a o, que
también es lo que queremos para ordenar.
array.array('l', [-ord(i) for i in s])
return "".join(unichr(0x10ffff-ord(i)) for i in s)
la primera usa menos memoria (medida con sys.getsizeof). No he medido
cuál es más rápida. 0x10ffff es el ord más alto de un unicode válido
en pythones más o menos nuevos (no sé cuándo empezó a ser así, pero
hace bastante) (y todavía podés compilar python para que sea más
chico, pero nadie lo hace que yo sepa).
Listo, me convenciste :-)
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Claudio Freire
2010-08-05 14:48:09 UTC
Permalink
Post by John Rowland Lenton
Post by Roberto Alsina
Dado un string S, crear una funcion f tal que S1>S2 => f(S1) < f(S2)
Ahí creo que es más claro :-)
creo que ya tenés una solución, pero tengo otra (o será la misma? :)
y ambas usan el hecho de que python no ordena por colación (que
depende del locale) sino por el ord() del unicode.
Digo... ¿no es más fácil crear un wrapper del str original que compare al
revés y chau?
Post by John Rowland Lenton
Post by Roberto Alsina
from antistr import antistr
l = map(antistr,map(str,range(10)))
l
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
Post by John Rowland Lenton
Post by Roberto Alsina
l.sort()
l
['9', '8', '7', '6', '5', '4', '3', '2', '1', '0']
Antistr:

class antistr(object):
__slots__ = ['s']
def __init__(self, s):
self.s = s
def __cmp__(self, o):
return -cmp(self.s, str(o))
def __lt__(self, o):
return self.s > str(o)
def __le__(self, o):
return self.s >= str(o)
def __gt__(self, o):
return self.s < str(o)
def __ge__(self, o):
return self.s <= str(o)
def __eq__(self, o):
return self.s == str(o)
def __ne__(self, o):
return self.s != str(o)
def __str__(self):
return self.s
def __repr__(self):
return repr(self.s)
Nicolas Sarubbi
2010-08-05 15:59:12 UTC
Permalink
Post by Claudio Freire
Dado un string S, crear una funcion f tal que  S1>S2 => f(S1) < f(S2)
Digo... ¿no es más fácil crear un wrapper del str original que compare al
revés y chau?
Si intentamos encontrar una funcion que transforme una cadena en otra,
caracter por caracter, encontramos otro problema que va mas ayá de
ordenar unicode... ¿ que pasa si S2.startswith(s1) ?? ¿y cual es la
transformación de la cadena vacía '' ?

por ejemplo:

'a' < 'aa' <==> f('a') > f('aa')

Suponiendo una función fácil que transforme las 'a' en 'z', resulta:
f('') = ''
f('a') = 'z'
f('aa') = 'zz'

entonces: ¿¿ '' < 'a' < 'aa' <=/=> '' > 'z' > 'zz' ??

Una posibilidad es agregar al final de la cadena un carácter mayor a
cualquier otro e irrepetible en el antistr.

Por ejemplo, suponiendo que '~' sea dicho carácter:
f('') = '~'
f('a') = 'z~'
f('aa') = 'zz~'
'' < 'a' < 'aa' <==> '~' > 'z~' > 'zz~'

Pero entonces la cadena antistr no debe contener otro carácter mayor o
igual a '~'.

La clase antistr de Claudio no tiene este problema, porque cambia la
clase del objeto, en lugar de cambiar su contenido.

saludos... nico.
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
John Rowland Lenton
2010-08-05 16:54:51 UTC
Permalink
Post by Nicolas Sarubbi
Post by Claudio Freire
Dado un string S, crear una funcion f tal que  S1>S2 => f(S1) < f(S2)
Digo... ¿no es más fácil crear un wrapper del str original que compare al
revés y chau?
Si intentamos encontrar una funcion que transforme una cadena en otra,
caracter por caracter, encontramos otro problema que va mas ayá de
ordenar unicode... ¿ que pasa si S2.startswith(s1) ?? ¿y cual es la
transformación de la cadena vacía '' ?
muy buen punto!

maldito problema. Ya no lo quiero :)
Roberto Alsina
2010-08-05 17:42:29 UTC
Permalink
Post by Claudio Freire
Post by John Rowland Lenton
Post by Roberto Alsina
Dado un string S, crear una funcion f tal que S1>S2 => f(S1) < f(S2)
Ahí creo que es más claro :-)
creo que ya tenés una solución, pero tengo otra (o será la misma? :)
y ambas usan el hecho de que python no ordena por colación (que
depende del locale) sino por el ord() del unicode.
Digo... ¿no es más fácil crear un wrapper del str original que compare al
revés y chau?
Puede ser. En este caso en particular se termina convertiendo todo a QString
asi que no me ayuda.
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Claudio Freire
2010-08-05 17:55:19 UTC
Permalink
Post by Roberto Alsina
Puede ser. En este caso en particular se termina convertiendo todo a QString
asi que no me ayuda.
¿entonces el que ordena es QT?

Eso puede cambiar las reglas de juego considerablemente, porque seguro que
QT ordena según el collation. Tendrías que saber el collation, y todo lo que
se discutió.

Para evitar eso podrías forzar el orden de python (binario) convirtiendo a
Post by Roberto Alsina
l = ["hola pepe", "hola juan", "pepe fue al médico", "yo también"]
l2 = map(lambda
l:"".join(map("%02X".__mod__,map(0xFF.__and__,map(int.__invert__,map(ord,l))))),
l)
Post by Roberto Alsina
l3 = sorted(list(zip(l2,l)))
l3
[('8690DF8B9E929D963C5691', 'yo tambi\xc3\xa9n'),
('8F9A8F9ADF998A9ADF9E93DF923C569B969C90', 'pepe fue al m\xc3\xa9dico'),
('9790939EDF8F9A8F9A', 'hola pepe'), ('9790939EDF958A9E91', 'hola juan')]
Post by Roberto Alsina
sorted(l)
['hola juan', 'hola pepe', 'pepe fue al m\xc3\xa9dico', 'yo tambi\xc3\xa9n']

Claro que esa columna extra tiene que estar oculta o se pudre todo ;)
Claudio Freire
2010-08-05 17:57:27 UTC
Permalink
Post by Claudio Freire
Para evitar eso podrías forzar el orden de python (binario) convirtiendo a
l = ["hola pepe", "hola juan", "pepe fue al médico", "yo también"]
l2 = map(lambda
l:"".join(map("%02X".__mod__,map(0xFF.__and__,map(int.__invert__,map(ord,l))))),
l)
l3 = sorted(list(zip(l2,l)))
l3
[('8690DF8B9E929D963C5691', 'yo tambi\xc3\xa9n'),
('8F9A8F9ADF998A9ADF9E93DF923C569B969C90', 'pepe fue al m\xc3\xa9dico'),
('9790939EDF8F9A8F9A', 'hola pepe'), ('9790939EDF958A9E91', 'hola juan')]
sorted(l)
['hola juan', 'hola pepe', 'pepe fue al m\xc3\xa9dico', 'yo
tambi\xc3\xa9n']
Ah, y como dijeron por ahí, para invertir el orden de las cadenas vacías y
de diferente longitud, se puede agregar 'G' a todas las cadenas (para que
las cadenas cortas vayan al final) o '\1' (para que las cadenas cortas vayan
primero)
Anthony Lenton
2010-08-05 18:11:05 UTC
Permalink
Confieso que no leí todo el thread, pero capaz ayudo...
Post by Roberto Alsina
Buenas, tengo un problema interesante.
Dado una lista de strings S1,S2...SN , producir una lista X1,X2,...XN que
al ordenarla alfabéticamente ordene **al revés** que la original.
O sea, si tengo
S1, X1
S2, X2
SN, XN
Quiero que si ordeno por la primera columna, S1, S2... SN queden en orden
alfabético creciente, y si ordeno en orden alfabético creciente por la
segunda, queden exactamente al revés.
Se entiende?
_______________________________________________
http://listas.python.org.ar/listinfo/pyar
PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Dado un string S, crear una funcion f tal que  S1>S2 => f(S1) < f(S2)
Ahí creo que es más claro :-)
Hacer esto es fácil con enteros porque son una secuencia infinita
hacia ambos lados, así que eligiendo cualquier punto al azar podés
encontrar simétricos para todos los demás respecto de este "cero".

Los strings en cambio son cerrados abajo: no hay ningún string más
chico que "". Entonces no vas a poder encontrar un negativo para
cualquiera, ya que si invertís el conjunto en sí mismo te quedaría un
conjunto "cerrado arriba".

Para ponerlo de otra manera: Si tomás f("") que, según el enunciado
inicial te tiene que devolver algún string, te queda una cantidad
finita de strings para la imagen de tu función, ya que f(x) debería
dar un string menor que éste para cualquier valor de x. Y
lamentablemente hay infintos strings mayores que "" por un lado, y
apenas un puñado de strings menores que f("") por otro.

Si podés asumir que hay un string "máximo" (chr(255)*sys.maxint?) sí
se hace posible, ya que transformaste los strings en un conjunto
cerrado en ambas puntas.
--
Anthony Lenton
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Anthony Lenton
2010-08-05 18:17:01 UTC
Permalink
Post by Anthony Lenton
Confieso que no leí todo el thread, pero capaz ayudo...
Post by Roberto Alsina
Buenas, tengo un problema interesante.
Dado una lista de strings S1,S2...SN , producir una lista X1,X2,...XN que
al ordenarla alfabéticamente ordene **al revés** que la original.
O sea, si tengo
S1, X1
S2, X2
SN, XN
Quiero que si ordeno por la primera columna, S1, S2... SN queden en orden
alfabético creciente, y si ordeno en orden alfabético creciente por la
segunda, queden exactamente al revés.
Se entiende?
_______________________________________________
http://listas.python.org.ar/listinfo/pyar
PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Dado un string S, crear una funcion f tal que  S1>S2 => f(S1) < f(S2)
Ahí creo que es más claro :-)
Hacer esto es fácil con enteros porque son una secuencia infinita
hacia ambos lados, así que eligiendo cualquier punto al azar podés
encontrar simétricos para todos los demás respecto de este "cero".
Los strings en cambio son cerrados abajo: no hay ningún string más
chico que "".  Entonces no vas a poder encontrar un negativo para
cualquiera, ya que si invertís el conjunto en sí mismo te quedaría un
conjunto "cerrado arriba".
Para ponerlo de otra manera:  Si tomás f("") que, según el enunciado
inicial te tiene que devolver algún string, te queda una cantidad
finita de strings para la imagen de tu función, ya que f(x) debería
dar un string menor que éste para cualquier valor de x.  Y
lamentablemente hay infintos strings mayores que "" por un lado, y
apenas un puñado de strings menores que f("") por otro.
Ok, esto último no se sostiene ni a palos, pero el parrafo anterior
creo que sigue siendo verdad :P
--
Anthony Lenton
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Roberto Alsina
2010-08-05 18:28:57 UTC
Permalink
Post by Anthony Lenton
Confieso que no leí todo el thread, pero capaz ayudo...
Post by Roberto Alsina
Post by Roberto Alsina
Buenas, tengo un problema interesante.
Dado una lista de strings S1,S2...SN , producir una lista X1,X2,...XN
que al ordenarla alfabéticamente ordene **al revés** que la original.
O sea, si tengo
S1, X1
S2, X2
SN, XN
Quiero que si ordeno por la primera columna, S1, S2... SN queden en
orden alfabético creciente, y si ordeno en orden alfabético creciente
por la segunda, queden exactamente al revés.
Se entiende?
_______________________________________________
http://listas.python.org.ar/listinfo/pyar
PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Dado un string S, crear una funcion f tal que S1>S2 => f(S1) < f(S2)
Ahí creo que es más claro :-)
Hacer esto es fácil con enteros porque son una secuencia infinita
hacia ambos lados, así que eligiendo cualquier punto al azar podés
encontrar simétricos para todos los demás respecto de este "cero".
Los strings en cambio son cerrados abajo: no hay ningún string más
chico que "". Entonces no vas a poder encontrar un negativo para
cualquiera, ya que si invertís el conjunto en sí mismo te quedaría un
conjunto "cerrado arriba".
Bueno, entonces lo cerramos de ambos lados diciendo "strings con una longitud
máxima de 100 caracteres"?
Post by Anthony Lenton
Para ponerlo de otra manera: Si tomás f("") que, según el enunciado
inicial te tiene que devolver algún string, te queda una cantidad
finita de strings para la imagen de tu función, ya que f(x) debería
dar un string menor que éste para cualquier valor de x. Y
lamentablemente hay infintos strings mayores que "" por un lado, y
apenas un puñado de strings menores que f("") por otro.
Si podés asumir que hay un string "máximo" (chr(255)*sys.maxint?) sí
se hace posible, ya que transformaste los strings en un conjunto
cerrado en ambas puntas.
Ok, creo que con una logitud maxima lo cerramos, porque (en el caso del ascii)
tenemos ahora el intervalo ['' .... 'z'*100] (por ejemplo)
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Lucio Torre
2010-08-08 05:14:08 UTC
Permalink
Post by Anthony Lenton
Si podés asumir que hay un string "máximo" (chr(255)*sys.maxint?) sí
se hace posible, ya que transformaste los strings en un conjunto
cerrado en ambas puntas.
Tambien se puede definir una f' basada en la f anterior tal que la
imagen de f() no sea los strings sino los strings terminados en T, tal
que "T" sea siempre mayor que cualquier string. Entonces "" (el string
menor) se mapea a "T", que es siempre mayor, y f'("a") == f("a") +"
T", f'("b") == f("b") + "T", y asi un string mas corto esta siempre
despues que uno mas largo.

Tambien si no queremos extender el dominio podemos usar max_char como
T y en lugar de limitar por largo limitar por utilizacion de un
caracter que no usa nadie.

Lucio.
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Alejandro Santos
2010-08-09 01:00:44 UTC
Permalink
Post by Lucio Torre
Post by Anthony Lenton
Si podés asumir que hay un string "máximo" (chr(255)*sys.maxint?) sí
se hace posible, ya que transformaste los strings en un conjunto
cerrado en ambas puntas.
Tambien se puede definir una f' basada en la f anterior tal que la
imagen de f() no sea los strings sino los strings terminados en T, tal
que "T" sea siempre mayor que cualquier string. Entonces "" (el string
menor) se mapea a "T", que es siempre mayor, y f'("a") == f("a") +"
T", f'("b") == f("b") + "T", y asi un string mas corto esta siempre
despues que uno mas largo.
Tambien si no queremos extender el dominio podemos usar max_char como
T y en lugar de limitar por largo limitar por utilizacion de un
caracter que no usa nadie.
La idea es encontrar un f que de vuelta el anti-string, con la
propiedad de que f(f(palabra)) == palabra.

Usando bytes, el T sería chr(255), pero el resultado de f.f habria que
cortarlo en la primer ocurrencia del inverso de T, o sea chr(0).

Y eso estaría bien, porque la ordenacion de strings compara de a pares
de caracteres, cortando en la primer diferencia. Y cuando se comparan
strings de diferente longitud con el mas largo siendo una extension
del otro, el orden de los strings se hace por el primer caracter
despues de la parte en común, que es lo mismo que decis que el string
mas corto tiene un chr(0) al final.

Una implementación sería la de mi mensaje anterior.
--
Alejandro Santos
http://www.alejandrosantos.com.ar
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Roberto Alsina
2010-08-09 01:13:55 UTC
Permalink
Post by Alejandro Santos
La idea es encontrar un f que de vuelta el anti-string, con la
propiedad de que f(f(palabra)) == palabra.
No, no necesariamente, no necesito que mantenga la palabra, solo el orden :-)
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Alejandro Santos
2010-08-09 01:22:15 UTC
Permalink
Post by Roberto Alsina
Post by Alejandro Santos
La idea es encontrar un f que de vuelta el anti-string, con la
propiedad de que f(f(palabra)) == palabra.
No, no necesariamente, no necesito que mantenga la palabra, solo el orden :-)
Tal cual, pero si se paso se encuentra algo que cumpla esa propiedad, mejor no?

Por cierto, muy buen problema. De donde salió?
--
Alejandro Santos
http://www.alejandrosantos.com.ar
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Roberto Alsina
2010-08-09 01:58:09 UTC
Permalink
Post by Alejandro Santos
Post by Roberto Alsina
Post by Alejandro Santos
La idea es encontrar un f que de vuelta el anti-string, con la
propiedad de que f(f(palabra)) == palabra.
No, no necesariamente, no necesito que mantenga la palabra, solo el orden :-)
Tal cual, pero si se paso se encuentra algo que cumpla esa propiedad, mejor no?
Por cierto, muy buen problema. De donde salió?
De tratar de ordenar un QTreeWidget
(http://doc.trolltech.com/4.6/qtreewidget.html) donde el primer nivel son
feeds (orden alfabético creciente) y el segundo nivel son posts (orden
cronológico decreciente).

Como el QTreeWidget se ordena por columnas, la solución que se me ocurrió fue
agregar otra columna (oculta) con un "key" que fuera, en el caso de los posts,
la fecha, y en el caso de los feeds el "anti-string" del nombre.
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Alejandro Santos
2010-08-09 02:34:25 UTC
Permalink
Post by Roberto Alsina
Post by Alejandro Santos
Por cierto, muy buen problema. De donde salió?
De tratar de ordenar un QTreeWidget
(http://doc.trolltech.com/4.6/qtreewidget.html) donde el primer nivel son
feeds (orden alfabético creciente) y el segundo nivel son posts (orden
cronológico decreciente).
Como el QTreeWidget se ordena por columnas, la solución que se me ocurrió fue
agregar otra columna (oculta) con un "key" que fuera, en el caso de los posts,
la fecha, y en el caso de los feeds el "anti-string" del nombre.
Se me ocurre una alternativa no tan rebuscada como el Anti-String:
hacer un QTreeWidgetItem propio con el operator <() redefinido. [1]

La ordenacion de los items en un QTreeView se hace en el método
QTreeModel::itemLessThan, [2] pero no es virtual asi que no se puede
redefinir.

Sería mucho más practico tener una clase QSortStrategy o similar en
vez del enum SortOrder. De cualquier forma, el Anti String es mucho
más interesante, por más sobre-ingenieria que sea hacerlo :)

[1] http://www.koders.com/cpp/fid5693B7EB91C08539ED01A5951357E75900CA8237.aspx?s=cdef%3atree+mdef%3ainsert#L142
[2] http://www.koders.com/cpp/fid0558BCA8C094915AEAC4FCA8243AB7FD2310B6B6.aspx?s=cdef%3Atree+mdef%3Ainsert#L579
--
Alejandro Santos
http://www.alejandrosantos.com.ar
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Roberto Alsina
2010-08-09 03:05:20 UTC
Permalink
Post by Alejandro Santos
hacer un QTreeWidgetItem propio con el operator <() redefinido. [1]
La ordenacion de los items en un QTreeView se hace en el método
QTreeModel::itemLessThan, [2] pero no es virtual asi que no se puede
redefinir.
Sería mucho más practico tener una clase QSortStrategy o similar en
vez del enum SortOrder. De cualquier forma, el Anti String es mucho
más interesante, por más sobre-ingenieria que sea hacerlo :)
Usando un QTreeView en vez de un QTreeWidget es trivial. Lo que no es trivial
es usar un QTreeView :-)
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/

Juan Pedro Fisanotti
2010-08-04 19:13:20 UTC
Permalink
El día 4 de agosto de 2010 15:51, Roberto Alsina
Post by Roberto Alsina
Buenas, tengo un problema interesante.
Dado una lista de strings S1,S2...SN , producir una lista X1,X2,...XN que al
ordenarla alfabéticamente ordene **al revés** que la original.
O sea, si tengo
S1, X1
S2, X2
SN, XN
Quiero que si ordeno por la primera columna, S1, S2... SN queden en orden
alfabético creciente, y si ordeno en orden alfabético creciente por la
segunda, queden exactamente al revés.
Se entiende?
Al orden lo manejas vos? Si lo manejas vos, podrias hacer esto:

def cmp(x, y):
if x[1] > y[1]:
return -1
elif x[1] < y[1]:
return -1
else:
return 0

lista.sort(cmp=cmp)
--
fisa  -  Juan Pedro Fisanotti
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Juan Pedro Fisanotti
2010-08-04 19:15:01 UTC
Permalink
El día 4 de agosto de 2010 16:13, Juan Pedro Fisanotti
Post by Juan Pedro Fisanotti
El día 4 de agosto de 2010 15:51, Roberto Alsina
Post by Roberto Alsina
Buenas, tengo un problema interesante.
Dado una lista de strings S1,S2...SN , producir una lista X1,X2,...XN que al
ordenarla alfabéticamente ordene **al revés** que la original.
O sea, si tengo
S1, X1
S2, X2
SN, XN
Quiero que si ordeno por la primera columna, S1, S2... SN queden en orden
alfabético creciente, y si ordeno en orden alfabético creciente por la
segunda, queden exactamente al revés.
Se entiende?
       return -1
       return -1
       return 0
lista.sort(cmp=cmp)
Aclaro, eso imaginando que tu lista es algo como
[
('S1', 'S2'),
('S1', 'S2'),
('S1', 'S2'),
('S1', 'S2'),
...
]
Y que queres ordenar por S2 "descendente"
--
fisa  -  Juan Pedro Fisanotti
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Juan Pedro Fisanotti
2010-08-04 19:16:16 UTC
Permalink
El día 4 de agosto de 2010 16:15, Juan Pedro Fisanotti
Post by Juan Pedro Fisanotti
El día 4 de agosto de 2010 16:13, Juan Pedro Fisanotti
Post by Juan Pedro Fisanotti
El día 4 de agosto de 2010 15:51, Roberto Alsina
Post by Roberto Alsina
Buenas, tengo un problema interesante.
Dado una lista de strings S1,S2...SN , producir una lista X1,X2,...XN que al
ordenarla alfabéticamente ordene **al revés** que la original.
O sea, si tengo
S1, X1
S2, X2
SN, XN
Quiero que si ordeno por la primera columna, S1, S2... SN queden en orden
alfabético creciente, y si ordeno en orden alfabético creciente por la
segunda, queden exactamente al revés.
Se entiende?
       return -1
       return -1
       return 0
lista.sort(cmp=cmp)
Aclaro, eso imaginando que tu lista es algo como
[
 ('S1', 'S2'),
 ('S1', 'S2'),
 ('S1', 'S2'),
 ('S1', 'S2'),
...
]
Y que queres ordenar por S2 "descendente"
Uh! Typo:

   elif x[1] < y[1]:
       return -1

era

   elif x[1] < y[1]:
       return 1
--
fisa  -  Juan Pedro Fisanotti
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Roberto Alsina
2010-08-04 19:19:48 UTC
Permalink
Post by Juan Pedro Fisanotti
return -1
return -1
return 0
lista.sort(cmp=cmp)
No, no puedo. Lo resolví con un enumerate pero me quedó la pica :-)
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Alejandro Santos
2010-08-06 17:44:50 UTC
Permalink
Post by Roberto Alsina
Buenas, tengo un problema interesante.
Dado una lista de strings S1,S2...SN , producir una lista X1,X2,...XN que al
ordenarla alfabéticamente ordene **al revés** que la original.
O sea, si tengo
S1, X1
S2, X2
SN, XN
Quiero que si ordeno por la primera columna, S1, S2... SN queden en orden
alfabético creciente, y si ordeno en orden alfabético creciente por la
segunda, queden exactamente al revés.
Algo asi sirve?

def columnizar(a):
b = [(x[1], len(a) - x[0]) for x in enumerate(a)]
return b

if __name__ == '__main__':
palabras = ['a', 'agua', 'almohada', 'b', 'borato', 'hipo',
'hopo', 'hupu', 'hipopotamo', 'zoom', 'zoom1', 'zorro']
col = columnizar(palabras)

print "Palabras ordenadas: ", sorted(col, key=lambda x: x[0])
print "Palabras al revez: ", sorted(col, key=lambda x: x[1])
--
Alejandro Santos
http://www.alejandrosantos.com.ar
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Alejandro Santos
2010-08-06 17:53:52 UTC
Permalink
   b = [(x[1], len(a) - x[0]) for x in enumerate(a)]
   return b
En realidad sería:

def columnizar(a):
b = [(x[1], len(a) - x[0]) for x in sorted(enumerate(a))]
return b

Lei el thread muy por arriba, creo que ya dijieron como se hacia con
la segunda columna como string, no?

def columnizar2(a):
b = zip(a,
[''.join(map((lambda w: chr(255 - ord(w))), x)) + chr(255) for x in a])

return b

Si no me equivoco, no hace falta tener un limite máximo de letras por palabra.
--
Alejandro Santos
http://www.alejandrosantos.com.ar
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
Loading...