[python-brasil] Como inverter uma tupla para executar no for

1 view
Skip to first unread message

Bruno Gomes

unread,
Feb 15, 2008, 10:50:21 AM2/15/08
to python...@yahoogrupos.com.br
Como tupla não há o method reverse, mesmo com lista ele retorna
NoneType eu esperava pela lista como retorno, para usar em um loop for
por exemplo.

Na referencia da linguagem [1] não cita algo sobre executar em ordem inversa


Alguns código para demostração:

- Reverse não existe em tuple

>>> x = ('a','b','c')
>>> type(x)
<type 'tuple'>
>>> x.reverse()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'reverse'

- Reverse em lista ok!

>>> z = ['a','b','c']
>>> type(z)
<type 'list'>
>>> z.reverse()
>>> z
['c', 'b', 'a']

- Porem não retorna a lista

>>> for i in z.reverse():
... i
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not iterable
>>>

1- http://docs.python.org/tut/node6.html#SECTION006200000000000000000
--
Bruno Gomes


,-----------------------------------------------------------.
| Antes de enviar um e-mail para o grupo leia: |
| http://www.pythonbrasil.com.br/moin.cgi/AntesDePerguntar |
| E se você é usuário do BOL lembre-se de cadastrar o |
| e-mail do grupo na lista branca do seu sistema anti-spam. |
`-----------------------------------------------------------´
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/python-brasil/

<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@yahoogrupos.com.br

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html


Walter Cruz

unread,
Feb 15, 2008, 10:53:35 AM2/15/08
to python...@yahoogrupos.com.br
reversed(tupla)

(Na verdade não reverte, mas gera um iterador revertido)

[]'s
- Walter

2008/2/15 Bruno Gomes <brunoper...@gmail.com>:

Pinguim Azul

unread,
Feb 15, 2008, 10:55:23 AM2/15/08
to python...@yahoogrupos.com.br
Pra reverter de verdade dá pra fazer assim:

>>> a=(1,2,3)
>>> tuple(list(a)[::-1])
(3, 2, 1)

2008/2/15 Walter Cruz <walte...@gmail.com>:

----------------------------------------------------------------
Ricardo Bittencourt http://www.mundobizarro.tk
ric...@700km.com.br "Save the trees. Eat more woodpeckers"
------ União contra o forward - crie suas proprias piadas ------

Leonardo Santagada

unread,
Feb 15, 2008, 11:05:44 AM2/15/08
to python...@yahoogrupos.com.br

On 15/02/2008, at 13:55, Pinguim Azul wrote:

> Pra reverter de verdade dá pra fazer assim:
>
>>>> a=(1,2,3)
>>>> tuple(list(a)[::-1])
> (3, 2, 1)


na verdade:

>>> a = (1, 2, 3)
>>> a[::-1]

Não precisa transformar em lista e depois em tupla :) e reverse não
retorna nada pq ele é inplace... python é OO e funcional lembre-se
sempre disso. se tu quer o resultado use a slice notation, se quiser o
metodo OO use o operador reverse de listas (tuplas não tem pq elas são
imutaveis).


:)


--
Leonardo Santagada

Jociel Andrade

unread,
Feb 15, 2008, 10:56:39 AM2/15/08
to python...@yahoogrupos.com.br
2008/2/15 Bruno Gomes <brunoper...@gmail.com>:

> >>> z = ['a','b','c']
> >>> type(z)
> <type 'list'>
> >>> z.reverse()
> >>> z
> ['c', 'b', 'a']
>
> - Porem não retorna a lista
>
> >>> for i in z.reverse():
> ... i

Talvez vc poderia fazer assim:

z.reverse()
for i in z:
... i

Bruno Gomes

unread,
Feb 15, 2008, 12:12:34 PM2/15/08
to python...@yahoogrupos.com.br
Obrigado a todos,
Adotei essa!
>>> x = ['a','b','c']
>>> for i in x[-2::-1]:
... i
...
'b'
'a'
>>>

Não conhecia esse terceiro parâmetro nos slices...


Em 15/02/08, Leonardo Santagada <sant...@gmail.com> escreveu:


>
>
>
> >>> a = (1, 2, 3)
> >>> a[::-1]
>
> Não precisa transformar em lista e depois em tupla :) e reverse não
> retorna nada pq ele é inplace... python é OO e funcional lembre-se
> sempre disso. se tu quer o resultado use a slice notation, se quiser o
> metodo OO use o operador reverse de listas (tuplas não tem pq elas são
> imutaveis).
>
> :)
>

--
Bruno Gomes

Luciano Ramalho

unread,
Feb 15, 2008, 12:20:57 PM2/15/08
to python...@yahoogrupos.com.br
2008/2/15 Pinguim Azul <bluep...@gmail.com>:

> Pra reverter de verdade dá pra fazer assim:
>
> >>> a=(1,2,3)
> >>> tuple(list(a)[::-1])
> (3, 2, 1)

Grande Pinguim, legal a tua dica por exibir o terceiro parâmetro do
slice, mas vamos combinar que desse jeito a coisa fica tão feia que
nem parece Python...

Acho que o jeito canônico de fazer isso hoje é assim:

>>> a = (1, 2, 3)

>>> tuple(reversed(a))
(3, 2, 1)
>>>

O Guido deve ter colocado o reversed como função primitiva, porque
imaginou que seria muito útil, e certamente é a forma mais legível e
genérica para acessar qualquer sequência em ordem inversa.

Vale notar que o reversed() retorna um generator, o que significa que
ele não duplica os dados da sequência. No caso acima a duplicação só
ocorre quando eu passo o reversed(a) como para o construtor tuple. Se
a intenção fosse apenas percorrer os itens em ordem inversa, não seria
necessário reconstruir a tupla, claro:

>>> for i in reversed(a): print i
...
3
2
1
>>>


[ ]s
Luciano

Guilherme Polo

unread,
Feb 15, 2008, 2:36:32 PM2/15/08
to python...@yahoogrupos.com.br
Em 15/02/08, Leonardo Santagada <sant...@gmail.com> escreveu:
>
>
> On 15/02/2008, at 13:55, Pinguim Azul wrote:
>
> > Pra reverter de verdade dá pra fazer assim:
> >
> >>>> a=(1,2,3)
> >>>> tuple(list(a)[::-1])
> > (3, 2, 1)
>
> na verdade:
>
> >>> a = (1, 2, 3)
> >>> a[::-1]
>
> Não precisa transformar em lista e depois em tupla :) e reverse não
> retorna nada pq ele é inplace... python é OO e funcional lembre-se
> sempre disso. se tu quer o resultado use a slice notation, se quiser o
> metodo OO use o operador reverse de listas (tuplas não tem pq elas são
> imutaveis).
>
> :)
>
> --
> Leonardo Santagada
>
>
>
Sem querer sair muito do topico, mas ja saindo... tuplas serem imutaveis nao
eh a razao delas nao terem metodos (nao contando os __especiais__), olha um
objeto str quantos metodos eles nao tem. Tudo bem que em 1991 o Guido nao
aceitava objetos string terem metodos mas mudou depois com o tempo, segue
quote:

"
>*Shouldn't that `string.split' be*
*>`line.split'?*

No it's definitely "string.split(line)". The point is, for better or for
worse, strings don't have attributes, so all string operations that aren't
built-in operations (like "+" for concatenation) have to be functions.
The module "string" is a collection of such functions.
"
E tambem ta sendo discutido adicionar alguns metodos a tuplas no python 3.0,
ou seja, as tuplas serem assim foi porque o Guido quis que fosse assim e
manteve assim. Era so isso que eu queria dizer. Normalmente eu nao respondo
emails assim (offtopic/discussao/correcao), mas deu vontade so pra variar ;p

--
-- Guilherme H. Polo Goncalves


[As partes desta mensagem que não continham texto foram removidas]

Leonardo Santagada

unread,
Feb 15, 2008, 2:40:27 PM2/15/08
to python...@yahoogrupos.com.br

On 15/02/2008, at 17:36, Guilherme Polo wrote:
> Sem querer sair muito do topico, mas ja saindo... tuplas serem
> imutaveis nao
> eh a razao delas nao terem metodos (nao contando os __especiais__),
> olha um
> objeto str quantos metodos eles nao tem. Tudo bem que em 1991 o
> Guido nao
> aceitava objetos string terem metodos mas mudou depois com o tempo,
> segue
> quote:


Eu não disse isso, mas objetos imutaveis não vão ter metodos q mudam
os dados *inplace*.

--
Leonardo Santagada

Guilherme Polo

unread,
Feb 15, 2008, 2:56:03 PM2/15/08
to python...@yahoogrupos.com.br
Em 15/02/08, Leonardo Santagada <sant...@gmail.com> escreveu:
>
>
> On 15/02/2008, at 17:36, Guilherme Polo wrote:
> > Sem querer sair muito do topico, mas ja saindo... tuplas serem
> > imutaveis nao
> > eh a razao delas nao terem metodos (nao contando os __especiais__),
> > olha um
> > objeto str quantos metodos eles nao tem. Tudo bem que em 1991 o
> > Guido nao
> > aceitava objetos string terem metodos mas mudou depois com o tempo,
> > segue
> > quote:
>
> Eu não disse isso, mas objetos imutaveis não vão ter metodos q mudam
> os dados *inplace*.
>
> --
> Leonardo Santagada
>
>
>
Sim, porque ai nao seriam imutaveis.


--
-- Guilherme H. Polo Goncalves


[As partes desta mensagem que não continham texto foram removidas]

,-----------------------------------------------------------.

Reply all
Reply to author
Forward
0 new messages