Estou procurando uma maneira de dividir facilmente uma lista python ao meio.
Então, se eu tiver uma matriz:
A = [0,1,2,3,4,5]
Eu seria capaz de obter:
B = [0,1,2]
C = [3,4,5]
A = [1,2,3,4,5,6]
B = A[:len(A)//2]
C = A[len(A)//2:]
Se você deseja uma função:
def split_list(a_list):
half = len(a_list)//2
return a_list[:half], a_list[half:]
A = [1,2,3,4,5,6]
B, C = split_list(A)
B = A[:(len(A) // 10) * 8]
C = A[(len(A) // 10) * 8:]
Uma solução um pouco mais genérica (você pode especificar o número de partes que deseja, e não apenas dividir 'ao meio'):
EDIT : postagem atualizada para lidar com comprimentos de lista ímpares
EDIT2 : atualização post novamente com base em comentários informativos de Brians
fonte
//
significa divisão inteira. Eles não devem ser deixados de fora, pois são bastante essenciais para fazer esse trabalho.n
- o comprimento predefinido das matrizes de resultadosfonte
Teste:
resultado:
fonte
for i,j in zip(list,lengths): print(split(i,j))
. As listaslist
elengths
têm o mesmo comprimento. j é alternado: 5,4,5,4,5, e a função de divisão funciona nas duas primeiras alternações, ou seja, divide o primeiroi
da lista por 5 e 4, mas, na próxima iteração, o divide em 4,4, 1 : \ Por favor, responda se você gostaria de me explicar mais (postar uma nova pergunta)Se você não se importa com o pedido ...
list[::2]
obtém cada segundo elemento da lista começando no 0º elemento.list[1::2]
obtém cada segundo elemento da lista começando no 1º elemento.fonte
list
com sombreamento do internolist(...)
. Eu já vilst
elist_
usei comumente para evitá-lo.B,C=A[:len(A)/2],A[len(A)/2:]
fonte
Aqui está uma solução comum, dividir arr em parte de contagem
fonte
Eu testei e a barra dupla é necessária para forçar a divisão int no python 3. Minha postagem original estava correta, embora o wysiwyg tenha quebrado no Opera, por algum motivo.
fonte
Existe uma receita oficial do Python para o caso mais generalizado de dividir uma matriz em matrizes menores de tamanho
n
.Este trecho de código é da página de documentos python itertools .
fonte
Usando o fatiamento de lista . A sintaxe é basicamente
my_list[start_index:end_index]
Para obter a primeira metade da lista, você fatia do primeiro índice para
len(i)//2
(onde//
está a divisão inteira - então3//2 will give the floored result of
1, instead of the invalid list index of
1,5`):..e troque os valores para obter a segunda metade:
fonte
3//2
dá1
, então você obtémi[:1]
o que lhe dá[0]
e ei[1:]
que dá[1, 2]
Se você tem uma lista grande, é melhor usar as ferramentas de controle e escrever uma função para produzir cada parte conforme necessário:
Você pode usar isso como:
A saída é:
Obrigado a @thefourtheye e @Bede Constantinides
fonte
10 anos depois .. eu pensei - por que não adicionar outro:
fonte
Embora as respostas acima sejam mais ou menos corretas, você pode ter problemas se o tamanho da sua matriz não for divisível por 2, como resultado de
a / 2
um fato estranho ser um flutuador no python 3.0 e na versão anterior se você especifiquefrom __future__ import division
no início do seu script. De qualquer forma, é melhor você optar pela divisão de números inteiros, ou sejaa // 2
, para obter compatibilidade "avançada" do seu código.fonte
Isso é semelhante a outras soluções, mas um pouco mais rápido.
fonte
Com dicas de @ChristopheD
fonte
fonte
Outra visão sobre esse problema em 2020 ... Aqui está uma generalização do problema. Eu interpreto o 'dividir uma lista ao meio' como sendo .. (ou seja, apenas duas listas e não haverá transbordamento para uma terceira matriz no caso de uma saída ímpar etc). Por exemplo, se o comprimento da matriz for 19 e uma divisão por duas usando //, o operador fornecerá 9, e teremos duas matrizes de comprimento 9 e uma matriz (terceira) de comprimento 1 (totalizando três matrizes). Se quisermos que uma solução geral forneça duas matrizes o tempo todo, assumirei que estamos felizes com as matrizes resultantes que não são iguais em comprimento (uma será maior que a outra). E que é considerado aceitável que a ordem seja misturada (alternando neste caso).
Esse conceito funciona para qualquer quantidade de partição de lista que você desejar (você precisará ajustar o código dependendo de quantas partes da lista desejar). E é bastante simples de interpretar. Para acelerar as coisas, você pode até escrever esse loop em cython / C / C ++ para acelerar as coisas. Então, novamente, eu tentei esse código em listas relativamente pequenas ~ 10.000 linhas e termina em uma fração de segundo.
Apenas meus dois centavos.
Obrigado!
fonte