Je cherche un moyen de diviser facilement une liste de python en deux.
Donc, si j'ai un tableau:
A = [0,1,2,3,4,5]
Je pourrais 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)
B = A[:(len(A) // 10) * 8]
C = A[(len(A) // 10) * 8:]
Une solution un peu plus générique (vous pouvez spécifier le nombre de pièces que vous voulez, pas seulement diviser `` en deux ''):
EDIT : publication mise à jour pour gérer les longueurs de liste impaires
EDIT2 : mettre à jour le post à nouveau sur la base des commentaires informatifs de Brians
la source
//
signifie division entière. Ils ne doivent pas être laissés de côté car ils sont tout à fait essentiels pour faire ce travail.n
- la longueur prédéfinie des tableaux de résultatsla source
Tester:
résultat:
la source
for i,j in zip(list,lengths): print(split(i,j))
. Les listeslist
etlengths
ont la même longueur. j est alterné: 5,4,5,4,5, et la fonction de division fonctionne sur les deux premières alternances, c'est-à-dire qu'elle divise la premièrei
de la liste par 5 et 4, MAIS à l'itération suivante, elle la divise en 4,4, 1. : \ Veuillez répondre si vous souhaitez que je vous explique plus (postez une nouvelle question)Si vous ne vous souciez pas de la commande ...
list[::2]
obtient chaque deuxième élément de la liste à partir du 0e élément.list[1::2]
obtient chaque deuxième élément de la liste à partir du premier élément.la source
list
avec ombrage de l'élémentlist(...)
intégré. J'ai vulst
etlist_
utilisé couramment pour l'éviter.B,C=A[:len(A)/2],A[len(A)/2:]
la source
Voici une solution courante, diviser arr en partie count
la source
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 ait cassé dans Opera, pour une raison quelconque.
la source
Il existe un reçu officiel Python pour le cas plus généralisé de fractionnement d'un tableau en tableaux plus petits de taille
n
.Cet extrait de code provient de la page de documentation python itertools .
la source
Utilisation du découpage de liste . La syntaxe est essentiellement
my_list[start_index:end_index]
Pour obtenir la première moitié de la liste, vous coupez du premier index à
len(i)//2
(où//
est la division entière - donc3//2 will give the floored result of
1, instead of the invalid list index of
1,5`):.. et permutez les valeurs pour obtenir la seconde moitié:
la source
3//2
donne1
, alors vous obtenezi[:1]
ce qui vous donne[0]
eti[1:]
ce qui donne[1, 2]
Si vous avez une grande liste, il est préférable d'utiliser itertools et d'écrire une fonction pour produire chaque partie au besoin:
Vous pouvez utiliser ceci comme:
La sortie est:
Merci à @thefourtheye et @Bede Constantinides
la source
10 ans plus tard .. j'ai pensé - pourquoi ne pas en ajouter un autre:
la source
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 fait d'
a / 2
être étrange est un flottant en python 3.0, et dans la version antérieure si vous spécifiezfrom __future__ import division
au début de votre script. Dans tous les cas, il vaut mieux opter pour la division entière, c'esta // 2
-à- dire pour obtenir la compatibilité "en avant" de votre code.la source
Ceci est similaire à d'autres solutions, mais un peu plus rapide.
la source
Avec des conseils de @ChristopheD
la source
la source
Une autre prise sur ce problème en 2020 ... Voici une généralisation du problème. J'interprète le «diviser une liste en deux» comme étant .. (c'est-à-dire deux listes seulement et il n'y aura pas de débordement vers un troisième tableau en cas de sortie étrange, etc.). Par exemple, si la longueur du tableau est 19 et qu'une division par deux en utilisant l'opérateur // donne 9, et nous finirons par avoir deux tableaux de longueur 9 et un tableau (troisième) de longueur 1 (donc au total trois tableaux). Si nous voulons une solution générale pour donner deux tableaux tout le temps, je suppose que nous sommes satisfaits des tableaux duo résultants qui ne sont pas égaux en longueur (l'un sera plus long que l'autre). Et que son supposé être ok pour avoir l'ordre mélangé (en alternance dans ce cas).
Ce concept fonctionne pour n'importe quelle quantité de partition de liste que vous le souhaitez (vous devrez modifier le code en fonction du nombre de parties de liste souhaitées). Et c'est plutôt simple à interpréter. Pour accélérer les choses, vous pouvez même écrire cette boucle dans cython / C / C ++ pour accélérer les choses. Là encore, j'ai essayé ce code sur des listes relativement petites d'environ 10000 lignes et il se termine en une fraction de seconde.
Juste mes deux cents.
Merci!
la source