Ir para o conteúdo
  • 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

Mensagens Recomendadas

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?

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Editado por brunoais
2x quote

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por thoga31

Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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]

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Editado por thoga31

Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

O Python não tem uma slice notation que permite fazer isto directamente?

Mais info aqui: http://en.wikibooks.org/wiki/Python_Programming/Lists#Non-Continuous_slices

Sim, tem, claro.

De facto pode ficar aqui a solução com esse método, que é mais simples:

>>> l = [i for i in range(10)]
>>> l[2::3]
[3, 6, 9]


Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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º, ...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Editado por ffunenga

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.