[PYTHON] Teilen wir eine Reihe von ganzen Zahlen auf einmal in Reste auf

Zum Beispiel $ \ 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)]

Daher kann die Ganzzahl durch den Rest von $ 0 $, $ 1 $ und $ 2 $ geteilt werden, wenn sie durch $ 3 $ geteilt wird. Wenn Sie in eine Liste eintauchen, die keine Zahl ist, überspringen Sie drei Inhalte in einem Block.

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

Ich weiß nicht, ob diese Notation cool erscheint, aber lassen Sie mich kurz erklären, warum sie funktioniert. Zum Beispiel

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

In 4 mal 3 Zahlen teilen

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

Ich denke, dass es eine Methode gibt, die ziemlich berühmt ist. Tatsächlich wird es plötzlich in Offizielle Tutorial-Zip-Funktion geschrieben.

Mit der Redewendung können Sie die Datenreihen mit> zip (* [iter (s)] * n) in Gruppen der Länge n gruppieren.

Wenn Sie genauer hinschauen, werden Sie feststellen, dass Sie, wenn Sie dieses Ergebnis in die Zip-Funktion eintauchen, eine Liste mit drei Übersprungen erhalten.

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

Wenn Sie jedoch bei dieser Methode versuchen, eine Liste mit 10 Zahlen in 3 Zahlen zu unterteilen, wird der ungerade Teil abgeschnitten.

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

Dies ist die Spezifikation der Funktion "zip". Um dies zu vermeiden, wird die Funktion zip_longest in itertools bereitgestellt.

from itertools import zip_longest
list(zip_longest(*[iter(list(range(10)))]*3)) #Keiner tritt an ungeraden Stellen ein
[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, None, None)]

Verwenden wir dies, um den Überschuss zu aktualisieren. Schließlich gibt es einen Prozess zum Entfernen von "Keine", aber beachten Sie, dass "Tupel" unveränderlich ist. Am Ende war es eine Sammlung von "Mengen", wie Mathematik.

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}]

Die zip Funktion ~~ Ich mag den Namen nicht wirklich ~~ aber er ist tief.

Recommended Posts

Teilen wir eine Reihe von ganzen Zahlen auf einmal in Reste auf
Python, das viele Excel zu einem Excel zusammenführt
Eine Reihe von Skriptdateien, die Wordcloud mit Python3 ausführen
So kombinieren Sie alle CSVs in einem Ordner zu einer CSV
So konvertieren Sie 0,5 in 1056964608 auf einmal
Reversibles Verwürfeln von Ganzzahlen in Python
Zeigen Sie eine Liste der Alphabete in Python 3 an
Summe der Variablen in einem mathematischen Modell
Erstellen Sie eine Liste, in der Zeichen als ein Element in einer Zeichenfolge gespeichert sind
Ich möchte einen Lebenszyklus in der Aufgabendefinition von ECS festlegen