Je cherche un moyen de diviser facilement une liste python en deux.
Alors que si j'ai un tableau:
A = [0,1,2,3,4,5]
Je serais capable d'obtenir:
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:]
Si vous voulez une fonction:
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)
Une solution un peu plus générique (vous pouvez spécifier le nombre de pièces que vous voulez, pas simplement scinder en deux)
EDIT: post mis à jour pour gérer les longueurs de liste impaires
EDIT2 : mise à jour à nouveau sur la base des commentaires informatifs de Brians
def split_list(alist, wanted_parts=1):
length = len(alist)
return [ alist[i*length // wanted_parts: (i+1)*length // wanted_parts]
for i in range(wanted_parts) ]
A = [0,1,2,3,4,5,6,7,8,9]
print split_list(A, wanted_parts=1)
print split_list(A, wanted_parts=2)
print split_list(A, wanted_parts=8)
f = lambda A, n=3: [A[i:i+n] for i in range(0, len(A), n)]
f(A)
n
- la longueur prédéfinie des tableaux de résultats
def split(arr, size):
arrs = []
while len(arr) > size:
pice = arr[:size]
arrs.append(pice)
arr = arr[size:]
arrs.append(arr)
return arrs
Tester:
x=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
print(split(x, 5))
résultat:
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13]]
Voici une solution commune, diviser la partie arr en compte
def split(arr, count):
return [arr[i::count] for i in range(count)]
B,C=A[:len(A)/2],A[len(A)/2:]
Si vous ne vous souciez pas de la commande ...
def split(list):
return list[::2], list[1::2]
list[::2]
récupère chaque deuxième élément de la liste à partir du 0e élément.list[1::2]
récupère chaque deuxième élément de la liste à partir du premier élément.
def splitter(A):
B = A[0:len(A)//2]
C = A[len(A)//2:]
return (B,C)
J'ai testé, et la double barre oblique est nécessaire pour forcer la division int en python 3. Mon message d'origine était correct, bien que wysiwyg soit tombé en panne dans Opera, pour une raison quelconque.
Il existe une recette officielle Python pour le cas plus généralisé de division d'un tableau en tableaux plus petits de taille n
.
from itertools import izip_longest
def grouper(n, iterable, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
Cet extrait de code provient de la page de documentation python itertools .
Utiliser découper la liste . La syntaxe est fondamentalement my_list[start_index:end_index]
>>> i = [0,1,2,3,4,5]
>>> i[:3] # same as i[0:3] - grabs from first to third index (0->2)
[0, 1, 2]
>>> i[3:] # same as i[3:len(i)] - grabs from fourth index to end
[3, 4, 5]
Pour obtenir la première moitié de la liste, vous coupez le premier index en len(i)/2
...
>>> i[:len(i)/2]
[0, 1, 2]
..et permutez les valeurs pour obtenir la seconde moitié:
>>> i[len(i)/2:]
[3, 4, 5]
Bien que les réponses ci-dessus soient plus ou moins correctes, vous pouvez rencontrer des problèmes si la taille de votre tableau n'est pas divisible par 2, car le résultat de a / 2
, un nombre impair, est un nombre flottant dans python 3.0 et vous spécifiez from __future__ import division
au début de votre script. Dans tous les cas, il est préférable d’utiliser la division entière, c’est-à-dire a // 2
, afin d’obtenir la compatibilité "en aval" de votre code.
Ceci est similaire aux autres solutions, mais un peu plus vite.
# Usage: split_half([1,2,3,4,5]) Result: ([1, 2], [3, 4, 5])
def split_half(a):
half = len(a) >> 1
return a[:half], a[half:]
Si vous avez une grande liste, il vaut mieux utiliser itertools et écrire une fonction pour générer chaque partie selon vos besoins
from itertools import islice
def make_chunks(data, SIZE):
it = iter(data)
# use `xragne` if you are in python 2.7:
for i in range(0, len(data), SIZE):
yield [k for k in islice(it, SIZE)]
Vous pouvez utiliser ceci comme:
A = [0, 1, 2, 3, 4, 5, 6]
size = len(A) // 2
for sample in make_chunks(A, size):
print(sample)
La sortie est:
[0, 1, 2]
[3, 4, 5]
[6]
Merci à @thefourtheye et @Bede Constantinides
10 ans plus tard, je pensais - pourquoi ne pas en ajouter un autre:
arr = 'Some random string' * 10; n = 4
print([arr[e:e+n] for e in range(0,len(arr),n)])
Avec des astuces de @ChristopheD
def line_split(N, K=1):
length = len(N)
return [N[i*length/K:(i+1)*length/K] for i in range(K)]
A = [0,1,2,3,4,5,6,7,8,9]
print line_split(A,1)
print line_split(A,2)
#for python 3
A = [0,1,2,3,4,5]
l = len(A)/2
B = A[:int(l)]
C = A[int(l):]