[python-brasil] cortar uma lista em partes

1,275 views
Skip to first unread message

Diogo Rogério Maurílio

unread,
Aug 9, 2007, 9:07:04 PM8/9/07
to Python-Brasil

Seguinte, tem como dividir uma lista em várias partes iguais?

Tipo, se eu tenho a lista: ["a", "b", 1, 3, 4, 10, 20]
se eu quizer dividir ela em partes de no máximo 3 elementos assim:
["a", "b", 1] [3, 4, 10] [20]
como eu faço isso sem ser gambiarra com for?

__._,_.___
,-----------------------------------------------------------.
| 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. |
`-----------------------------------------------------------´
Atividade nos últimos dias
Visite seu Grupo
Yahoo! Mail

Conecte-se ao mundo

Proteção anti-spam

Muito mais espaço

Yahoo! Barra

Instale grátis

Buscar sites na web

Checar seus e-mails .

Yahoo! Grupos

Crie seu próprio grupo

A melhor forma de comunicação

.

__,_._,___

Rodrigo Bernardo Pimentel

unread,
Aug 9, 2007, 9:13:47 PM8/9/07
to python...@yahoogrupos.com.br

Diogo Rogério Maurílio <diogooo@gmail.com> wrote:

> Tipo, se eu tenho a lista: ["a", "b", 1, 3, 4, 10, 20]
> se eu quizer dividir ela em partes de no máximo 3 elementos assim:
> ["a", "b", 1] [3, 4, 10] [20]
> como eu faço isso sem ser gambiarra com for?

Acho que o jeito mais direto é com list comprehensions + slicing:

>>> lista = ["a", "b", 1, 3, 4, 10, 20]
>>> [lista[i:i+3] for i in range(0, len(lista), 3)]
[['a', 'b', 1], [3, 4, 10], [20]]

rbp
--
http://isnomore.net

----------------------------------------------------------

__._,_.___

__,_._,___

Luciano Ramalho

unread,
Aug 9, 2007, 9:36:46 PM8/9/07
to python...@yahoogrupos.com.br

Serve uma gambiarra com while? Não é muito eficiente, mas pelo menos é
fácil de entender:

def dividir(lista, max_parte):
# se não precisar preservar a lista original
# pode apagar a próxima linha
lista = lista[:]
partes = []
while lista:
partes.append(lista[:max_parte])
del lista[:max_parte]
return partes

[ ]s
Luciano



On 8/9/07, Diogo Rogério Maurílio <diogooo@gmail.com> wrote:
> Seguinte, tem como dividir uma lista em várias partes iguais?
>
> Tipo, se eu tenho a lista: ["a", "b", 1, 3, 4, 10, 20]
> se eu quizer dividir ela em partes de no máximo 3 elementos assim:
> ["a", "b", 1] [3, 4, 10] [20]
> como eu faço isso sem ser gambiarra com for?
>
>

> ,----------------------------------------------------------.


> | 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
>
>
>

__._,_.___

__,_._,___

Roger Demetrescu

unread,
Aug 9, 2007, 9:49:44 PM8/9/07
to python...@yahoogrupos.com.br

Além das respostas dos colegas, talvez valha a pena dar uma olhada aqui também:

http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/425397

[]s
Roger



On 8/9/07, Diogo Rogério Maurílio <diogooo@gmail.com> wrote:

> Seguinte, tem como dividir uma lista em várias partes iguais?
>
> Tipo, se eu tenho a lista: ["a", "b", 1, 3, 4, 10, 20]
> se eu quizer dividir ela em partes de no máximo 3 elementos assim:
> ["a", "b", 1] [3, 4, 10] [20]
> como eu faço isso sem ser gambiarra com for?
>
>

> ,----------------------------------------------------------.


> | 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
>
>
>


__,_._,___

Luciano Ramalho

unread,
Aug 9, 2007, 10:00:25 PM8/9/07
to python...@yahoogrupos.com.br

On 8/9/07, Rodrigo Bernardo Pimentel <rbp@isnomore.net> wrote:
> >>> [lista[i:i+3] for i in range(0, len(lista), 3)]
> [['a', 'b', 1], [3, 4, 10], [20]]

Mandou muito bem, R!

[ ]s
Luciano


__,_._,___

Rodrigo Pinheiro Marques de Araújo

unread,
Aug 10, 2007, 9:30:01 AM8/10/07
to python...@yahoogrupos.com.br

On Thu, 09 Aug 2007 22:13:47 -0300


Rodrigo Bernardo Pimentel <rbp@isnomore.net> wrote:

> >>> lista = ["a", "b", 1, 3, 4, 10, 20]
> >>> [lista[i:i+3] for i in range(0, len(lista), 3)]
> [['a', 'b', 1], [3, 4, 10], [20]]

Gostei da solução do Rodrigo Bernardo, mas você poderia modificá-la pra usar generators também.


lista = ["a", "b", 1, 3, 4, 10, 20]

partes = (lista[i:i+3] for i in xrange(0, len(lista), 3))
In [20]: partes.next()
Out[20]: ['a', 'b', 1]

In [21]: partes.next()
Out[21]: [3, 4, 10]

In [22]: partes.next()
Out[22]: [20]

Só que ai você teria que tratar o StopIteration, se não utilizar num laço.

In [25]: for itr in partes:
....: print itr
....:
....:
['a', 'b', 1]
[3, 4, 10]
[20]

Rodrigo Fenrrir


_______________________________________________________
Yahoo! Mail - Sempre a melhor opção para você!
Experimente já e veja as novidades.
http://br.yahoo.com/mailbeta/tudonovo/



__,_._,___

Rodrigo Dias Arruda Senra

unread,
Aug 10, 2007, 6:04:03 PM8/10/07
to python...@yahoogrupos.com.br

[ Rodrigo Bernardo Pimentel ]:
---------------------


>Diogo Rogério Maurílio <diogooo@gmail.com> wrote:
>
>> Tipo, se eu tenho a lista: ["a", "b", 1, 3, 4, 10, 20]
>> se eu quizer dividir ela em partes de no máximo 3 elementos assim:
>> ["a", "b", 1] [3, 4, 10] [20]
>> como eu faço isso sem ser gambiarra com for?
>
>Acho que o jeito mais direto é com list comprehensions + slicing:
>
>>>> lista = ["a", "b", 1, 3, 4, 10, 20]
>>>> [lista[i:i+3] for i in range(0, len(lista), 3)]
>[['a', 'b', 1], [3, 4, 10], [20]]

Muito legal rbp!

Gostaria de sugerir uma outra alternativa, que não é tão
econômica, eficiente quanto a sua, mas ilustra
uma outra forma de abordar o problema.

<code>
# Python >= 2.5

def slicer(l,n):
return l if not l or len(l)<n else [l[:n]] + slicer(l[n:],n)

# Python < 2.5
def slicer(l,n):
if not l or len(l)<n:
return l
else:
return [l[:n]] + slicer(l[n:],n)

</code>

<output>
>>> slicer(lista,2)
[['a', 'b'], [1, 3], [4, 10], 20]
>>> slicer(lista,3)


[['a', 'b', 1], [3, 4, 10], 20]

</output>

Abração
Senra

__._,_.___
,-----------------------------------------------------------.
| 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. |
`-----------------------------------------------------------´
Atividade nos últimos dias
Visite seu Grupo
Yahoo! Mail

Conecte-se ao mundo

Proteção anti-spam

Muito mais espaço

Yahoo! Barra

Instale grátis

Buscar sites na web

Checar seus e-mails .

Yahoo! Grupos

Crie seu próprio grupo

A melhor forma de comunicação

.

__,_._,___

Rodrigo Bernardo Pimentel

unread,
Aug 10, 2007, 6:42:04 PM8/10/07
to python...@yahoogrupos.com.br

>> Diogo Rogério Maurílio <diogooo@gmail.com> wrote:
>>
>>> Tipo, se eu tenho a lista: ["a", "b", 1, 3, 4, 10, 20]
>>> se eu quizer dividir ela em partes de no máximo 3 elementos assim:
>>> ["a", "b", 1] [3, 4, 10] [20]

> [ Rodrigo Bernardo Pimentel ]:


>
>> Acho que o jeito mais direto é com list comprehensions + slicing:
>>
>>>>> lista = ["a", "b", 1, 3, 4, 10, 20]
>>>>> [lista[i:i+3] for i in range(0, len(lista), 3)]
>> [['a', 'b', 1], [3, 4, 10], [20]]

Rodrigo Dias Arruda Senra <rse...@acm.org> wrote:

> Muito legal rbp!

Tenquis :)



> Gostaria de sugerir uma outra alternativa, que não é tão
> econômica, eficiente quanto a sua, mas ilustra
> uma outra forma de abordar o problema.
>
> <code>
> # Python >= 2.5
>
> def slicer(l,n):
> return l if not l or len(l)<n else [l[:n]] + slicer(l[n:],n)
>
> # Python < 2.5
> def slicer(l,n):
> if not l or len(l)<n:
> return l
> else:
> return [l[:n]] + slicer(l[n:],n)
>
> </code>

Ah, muito bom! :D

Só tem um probleminha (em relação ao "enunciado" original): se você
vai cortando e sobra um pedaço menor que n, sua solução retorna os
ítens individuais, e não numa lista:



>>>> slicer(lista,2)
> [['a', 'b'], [1, 3], [4, 10], 20]
>>>> slicer(lista,3)
> [['a', 'b', 1], [3, 4, 10], 20]
> </output>

Ou seja, "20" ao invés de "[20]". Isso fica mais evidente se a lista
tiver um item a mais:

>>> lista.append(30)
>>> slicer(lista, 3)
[['a', 'b', 1], [3, 4, 10], 20, 30]

Se você mudar o "if" pra "if not l" (e deixar o slicing resolver o
problema de len(l) < n), dá certo:

>>> slicer(lista, 3)
[['a', 'b', 1], [3, 4, 10], [20, 30]]

De qualquer modo, fica legal a solução recursiva (especialmente em
python2.5) :)



rbp
--
http://isnomore.net

----------------------------------------------------------

__._,_.___
,-----------------------------------------------------------.
| 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. |
`-----------------------------------------------------------´
Atividade nos últimos dias
Visite seu Grupo
Yahoo! Mail

Conecte-se ao mundo

Proteção anti-spam

Muito mais espaço

Yahoo! Barra

Instale grátis

Buscar sites na web

Checar seus e-mails .

Yahoo! Grupos

Crie seu próprio grupo

A melhor forma de comunicação

.

__,_._,___

Rodrigo Dias Arruda Senra

unread,
Aug 10, 2007, 11:27:11 PM8/10/07
to python...@yahoogrupos.com.br

[ Rodrigo Bernardo Pimentel ]:
---------------------


>Só tem um probleminha (em relação ao "enunciado" original): se você
>vai cortando e sobra um pedaço menor que n, sua solução retorna os
>ítens individuais, e não numa lista:

Tem toda razão, foi falta de atenção minha!
Grazie molte.

Abração
Senra

__._,_.___
,-----------------------------------------------------------.
| 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. |
`-----------------------------------------------------------´
Atividade nos últimos dias
Visite seu Grupo
Yahoo! Mail

Conecte-se ao mundo

Proteção anti-spam

Muito mais espaço

Yahoo! Barra

Instale grátis

Buscar sites na web

Checar seus e-mails .

Yahoo! Grupos

Crie seu próprio grupo

A melhor forma de comunicação

.

__,_._,___
Reply all
Reply to author
Forward
0 new messages