Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

msmsms

devolver elementos de uma lista 3 em 3

Recommended Posts

msmsms

boas tenho a seguinte lista

lista = ['obj1', 'obj2', 'obj3', 'obj4','obj5','obj6', etc]

e quero obter os objectos 3 em 3 numa nova lista

solução = ['obj3', 'obj6', etc]

qual é a forma de resolução mais simples para resolver?

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
msmsms

O que já tentaste fazer para resolver essa questão?

pensei em fazer um for para devolver cada elemento sozinho

pensei em ir pela remoção de elementos com metodo remove()

não consigo ver como posso fazer para devolver só alguns dos elementos, neste caso de 3 em 3

por index par ou impar tambem não dá porque eu só quero os elementos de 3 em 3

gostaria de saber um jeito compreensível e simples de resolver

Edited by brunoais
2x quote

Share this post


Link to post
Share on other sites
thoga31

Quando fazes um ciclo for, utiliza-se normalmente um range, certo? Esse range recebe, no máximo, 3 argumentos, sendo eles:

range(inicio, fim, passo)

Teste no IDLE:

>>> list(range(0, 20, 3))
[0, 3, 6, 9, 12, 15, 18]

Agora adapta isto e constrói o teu ciclo for. Opcionalmente, também podes construir uma List Comprehension para este caso.

Edited by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
ffunenga
# lista inicial com um comprimento desconhecido
from random import randint
n = randint(0,100)
l1 = [i for i in range(n)]

# tal como o thoga31 disse, podes obter os elementos com List Comprehension
# algo do género
l2 = [l[i] for i in range(len(l)) if not i%3]

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
msmsms

Quando fazes um ciclo for, utiliza-se normalmente um range, certo? Esse range recebe, no máximo, 3 argumentos, sendo eles:

range(inicio, fim, passo)

Teste no IDLE:

>>> list(range(0, 20, 3))
[0, 3, 6, 9, 12, 15, 18]

Agora adapta isto e constrói o teu ciclo for. Opcionalmente, também podes construir uma List Comprehension para este caso.

nao quero fazer por lista de compreensão

não percebo como estas a pensar com o range

lista = ['obj1', 'obj2', 'obj3', 'obj4','obj5','obj6']
for i in range(0,-1,3):

dá-me mais detalhes...

Share this post


Link to post
Share on other sites
thoga31

não percebo como estas a pensar com o range

lista = ['obj1', 'obj2', 'obj3', 'obj4','obj5','obj6']
for i in range(0,-1,3):

dá-me mais detalhes...

Quando fazes um ciclo for, não costumas utilizar um range em muitos casos?

O range recebe três argumentos: o início, o fim, e o passo.

O exemplo que te dei com o IDLE foi a conversão de um range numa list para poderes ver os valores que o range assumia.

Para o exemplo que te dei, o range começa em 0 inclusive, termina em 20 exclusive, e anda de 3 em 3.

Agora tens de passar estes 3 argumentos aos range segundo as tuas necessidades. Qual é o primeiro elemento da lista que queres? Qual é o último elemento da lista? E de quantos em quantos queres? Aqui obtens a resposta para o teu problema.


Knowledge is free!

Share this post


Link to post
Share on other sites
msmsms

Quando fazes um ciclo for, não costumas utilizar um range em muitos casos?

O range recebe três argumentos: o início, o fim, e o passo.

O exemplo que te dei com o IDLE foi a conversão de um range numa list para poderes ver os valores que o range assumia.

Para o exemplo que te dei, o range começa em 0 inclusive, termina em 20 exclusive, e anda de 3 em 3.

Agora tens de passar estes 3 argumentos aos range segundo as tuas necessidades. Qual é o primeiro elemento da lista que queres? Qual é o último elemento da lista? E de quantos em quantos queres? Aqui obtens a resposta para o teu problema.

eu acho que não consigo

lista = ['obj1', 'obj2', 'obj3', 'obj4','obj5','obj6']
for i in range(2,-1,3): # 1º elemento é o indice 2
   print lista[i] # não imprime!

Share this post


Link to post
Share on other sites
thoga31

Então pensa lá bem nesse range...

Começas em 2, andas de 3 em 3 (para a frente), e terminas em -1?? Explica-me este mistério.

Como queres que imprima? Esse range é vazio! Não há nenhum conjunto de números que comece em 2 e termine em -1 com passo positivo!

Edited by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
msmsms

Então pensa lá bem nesse range...

Começas em 2, andas de 3 em 3 (para a frente), e terminas em -1?? Explica-me este mistério.

Como queres que imprima? Esse range é vazio! Não há nenhum conjunto de números que comece em 2 e termine em -1 com passo positivo!

mas eu não posso colocar um indice de fim porque a ideia é fazer para uma lista generica

se eu colocar um fim e se a lista aumentar como é que fica?

Share this post


Link to post
Share on other sites
msmsms

ok deu ;)

lista = ['obj1', 'obj2', 'obj3', 'obj4','obj5','obj6']
for i in range(2,len(lista),3):
   print lista[i]

Share this post


Link to post
Share on other sites
motherFFH

Uma alternativa mais... funcional.

from itertools import cycle, compress
print list(compress(l, cycle([0,0,1])))

A única vantagem é que podemos alterar mais facilmente o padrão de repetição, eg cycle([1,0,1,1]) dá o 1º, 3º, 4º, 5º, 7º, 8º, ...

Share this post


Link to post
Share on other sites
ffunenga

from itertools import cycle, compress
print list(compress(l, cycle([0,0,1])))

A única vantagem é que podemos alterar mais facilmente o padrão de repetição, eg cycle([1,0,1,1]) dá o 1º, 3º, 4º, 5º, 7º, 8º, ...

ehlá! very nice. Para casos mais complexos, cheira-me que esta maneira é a mais eficiente

Edited by ffunenga

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.