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