Sie eine besondere Verwendung von zip
verwenden können, um Elemente zu paaren:
s = '36 30 25 40 80 4'
ints = map(int, s.split()) #make into list of ints
sums = map(sum, zip(*[iter(ints)]*2))
print(''.join([chr(i) for i in sums]))
Edit: technisch iter
ist hier nicht notwendig, aber ich schreibe es, weil ich manchmal vergesse, wenn ich es brauche.
Edit 2: Adressieren jsbuenos Punkte unter:
map
nimmt eine Funktion und eine iterable (wie eine Liste) und wendet die Funktion auf jedes Element dieser iterable. So ist list(map(int, ['1', '2']))
das gleiche wie [int('1'), int('2')]
. Die list
ist da, weil map
tatsächlich einen Iterator zurückgibt, der die Werte einzeln statt alle auf einmal erzeugt.
Die Verwendung von zip
hier sieht komplex aus, aber das ist meistens die ganze Interpunktion. Lass uns versuchen, es zu durchbrechen. Wie ich bereits erwähnt habe, brauchen wir das iter
hier nicht, weil ints
ein map
Objekt ist und somit bereits ein Iterator, also müssen wir keinen Iterator dafür machen. So, jetzt sieht es aus wie
sums = map(sum, zip(*[ints]*2))
Alle map
tut besteht die Paare Zugabe, nachdem wir sie paaren, so lassen wir das verwerfen.
zip(*[ints]*2)
Der Trick, um das Verständnis dieser diese Liste Multiplikation ist das Verständnis geschieht zuerst
zip(*[ints, ints])
Die *
vor einem iterable das Auspacken Operator ist. Betrachten Sie es als die Liste ihre Argumente in die Funktion Dumping
zip(ints, ints)
Also, was ist zip
tatsächlich tun? Die normale Verwendung von zip
besteht darin, zwei Iterables zu nehmen und die Elemente wie oben zu paaren.
list(zip([1,2,3], [4,5,6])) #put the results from zip into a list
[(1, 4), (2, 5), (3, 6)]
Es funktioniert mit mehr als zwei Listen auch, aber dafür sind wir nicht hier.
Es ist wichtig zu beachten, dass in zip(ints, ints)
die beiden ints
Argumente das gleiche Objekt sind. Das bedeutet, wenn zip das erste Paar erstellt, erhält es zuerst das nächste Element vom ersten Argument ints
. Das ist 36
. Dann erhält es das nächste Element von seinem zweiten Argument, das dasselbe ints
ist. Also das nächste Element ist 30
. Es liefert dann diese zwei Elemente in einem Tupel und fährt fort, den Prozess für den Rest des Iterators zu wiederholen. Wenn Sie sich fragen, warum zip(*[iter(ints)]*2)
schreiben, wenn zip(ints, ints)
dasselbe bedeutet? Das liegt daran, dass Sie sicherstellen müssen, dass die Argumente das gleiche Objekt sind oder dass es nicht funktioniert. Doing zip(iter(ints),iter(ints))
würde nicht funktionieren, weil jeder iter
einen anderen, wenn auch identischen, Iterator zurückgibt. Ich habe Probleme, mich zu erinnern, wenn ich iter
verwenden muss, um auf Nummer sicher zu gehen, verwende ich es einfach die ganze Zeit.
Bekommst du Katzen und Fledermäuse durcheinander? – wim