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