web-dev-qa-db-fra.com

Diviser la liste en petites listes

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]
110
corymathews
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)
165
Jason Coon

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)
70
ChristopheD
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 

37
Jaro
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]]
26
Siamand Maroufi

Voici une solution commune, diviser la partie arr en compte

def split(arr, count):
     return [arr[i::count] for i in range(count)]
12
Chris Song

B,C=A[:len(A)/2],A[len(A)/2:]

12
John Montgomery

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.

10
sentythee
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.

7
Stefan Kendall

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 .

6
Jonathan Berger

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]
3
dbr

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.

2
user91259

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:]
0

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

0
M.A. Heshmat Khah

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)])
0
RoyM

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)
0
PunjCoder
#for python 3
    A = [0,1,2,3,4,5]
    l = len(A)/2
    B = A[:int(l)]
    C = A[int(l):]       
0
SuperGuy10