[PYTHON] Divisons un ensemble d'entiers en restes en un seul coup

Par exemple, $ \ bmod 3 $

ns = range(30)
m = 3
list(zip(*zip(*[iter(ns)]*m)))
[(0, 3, 6, 9, 12, 15, 18, 21, 24, 27),
 (1, 4, 7, 10, 13, 16, 19, 22, 25, 28),
 (2, 5, 8, 11, 14, 17, 20, 23, 26, 29)]

Par conséquent, l'entier peut être divisé par le reste de 0 $, 1 $ et 2 $ lorsqu'il est divisé par 3 $. Si vous plongez dans une liste qui n'est pas un nombre, sautez trois contenus en un seul morceau.

ls = list('abcdefghijkl')
m = 3
list(zip(*zip(*[iter(ls)]*m)))
[('a', 'd', 'g', 'j'), ('b', 'e', 'h', 'k'), ('c', 'f', 'i', 'l')]

Je ne sais pas si cette notation semble cool, mais laissez-moi vous expliquer brièvement pourquoi cela fonctionne. Par exemple

s = list(range(12))
s
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

Pour diviser en 4 par 3 nombres

list(zip(*[iter(s)]*3))
[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11)]

Je pense qu'il existe une méthode appelée, qui est assez célèbre. En fait, il est écrit soudainement dans Fonction zip du tutoriel officiel.

Vous pouvez utiliser l'idiome pour regrouper la série de données en groupes de longueur n en utilisant> zip (* [iter (s)] * n).

Si vous regardez de plus près, vous remarquerez que si vous plongez ce résultat dans la fonction zip, vous vous retrouverez avec une liste de trois sauts.

list(zip(*zip(*[iter(s)]*3)))
[(0, 3, 6, 9), (1, 4, 7, 10), (2, 5, 8, 11)]

Cependant, avec cette méthode, si vous essayez de diviser une liste de 10 nombres en 3 nombres, la partie impaire sera tronquée.

list(zip(*[iter(list(range(10)))]*3)) #9 est tronqué
[(0, 1, 2), (3, 4, 5), (6, 7, 8)]

Ceci est la spécification de la fonction «zip». Pour éviter cela, la fonction zip_longest est fournie dans ʻitertools`.

from itertools import zip_longest
list(zip_longest(*[iter(list(range(10)))]*3)) #Aucun n'entre dans des endroits étranges
[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, None, None)]

Utilisons ceci pour mettre à jour le surplus. Enfin, il existe un processus pour supprimer «Aucun», mais sachez que «tuple» est immuable. En fin de compte, c'était une collection de «ensembles», comme les mathématiques.

from itertools import zip_longest
ns = range(50)
m = 3
[{x for x in t if x != None} for t in zip(*zip_longest(*[iter(ns)]*m))]
[{0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48},
 {1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49},
 {2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47}]

La fonction zip ~~ Je n'aime pas vraiment le nom ~~, mais c'est profond.

Recommended Posts

Divisons un ensemble d'entiers en restes en un seul coup
Python qui fusionne beaucoup d'excellence en un seul Excel
Un ensemble de fichiers de script qui font wordcloud avec Python3
Comment combiner tous les CSV d'un dossier en un seul CSV
Comment convertir 0,5 en 1056964608 en un seul coup
Brouillage réversible d'entiers en Python
Afficher une liste d'alphabets en Python 3
Somme des variables dans un modèle mathématique
Faire une liste dans laquelle les caractères sont stockés comme un élément dans une chaîne de caractères
Je souhaite définir un cycle de vie dans la définition de tâche d'ECS