Add zipwith
This commit is contained in:
parent
243a93499f
commit
d282d65cde
@ -1250,3 +1250,20 @@ infinite series without consuming infinite amount of memory.
|
|||||||
... (while True (yield (.randint random low high))))
|
... (while True (yield (.randint random low high))))
|
||||||
=> (list-comp x [x (take 15 (random-numbers 1 50))])])
|
=> (list-comp x [x (take 15 (random-numbers 1 50))])])
|
||||||
[7, 41, 6, 22, 32, 17, 5, 38, 18, 38, 17, 14, 23, 23, 19]
|
[7, 41, 6, 22, 32, 17, 5, 38, 18, 38, 17, 14, 23, 23, 19]
|
||||||
|
|
||||||
|
zipwith
|
||||||
|
-------
|
||||||
|
|
||||||
|
`zipwith` zips multiple lists and maps the given function over the result. It is equilavent to calling `zip`, followed by calling `map` on the result.
|
||||||
|
|
||||||
|
In the following example, `zipwith` is used to add the contents of two lists together. The equilavent `map` and `zip` calls follow.
|
||||||
|
|
||||||
|
.. code-block:: clj
|
||||||
|
|
||||||
|
=> (import operator.add)
|
||||||
|
|
||||||
|
=> (zipwith operator.add [1 2 3] [4 5 6]) ; using zipwith
|
||||||
|
[5, 7, 9]
|
||||||
|
|
||||||
|
=> (map operator.add (zip [1 2 3] [4 5 6])) ; using map+zip
|
||||||
|
[5, 7, 9]
|
||||||
|
@ -345,10 +345,16 @@
|
|||||||
(_numeric_check n)
|
(_numeric_check n)
|
||||||
(= n 0))
|
(= n 0))
|
||||||
|
|
||||||
|
(defn zipwith [func &rest lists]
|
||||||
|
"Zip the contents of several lists and map a function to the result"
|
||||||
|
(do
|
||||||
|
(import functools)
|
||||||
|
(map (functools.partial (fn [f args] (apply f args)) func) (apply zip lists))))
|
||||||
|
|
||||||
(def *exports* '[calling-module-name coll? cons cons? cycle dec distinct
|
(def *exports* '[calling-module-name coll? cons cons? cycle dec distinct
|
||||||
disassemble drop drop-while empty? even? every? first filter
|
disassemble drop drop-while empty? even? every? first filter
|
||||||
flatten float? gensym identity inc instance? integer
|
flatten float? gensym identity inc instance? integer
|
||||||
integer? integer-char? iterable? iterate iterator?
|
integer? integer-char? iterable? iterate iterator?
|
||||||
list* macroexpand macroexpand-1 neg? nil? none? nth
|
list* macroexpand macroexpand-1 neg? nil? none? nth
|
||||||
numeric? odd? pos? remove repeat repeatedly rest second
|
numeric? odd? pos? remove repeat repeatedly rest second
|
||||||
some string string? take take-nth take-while zero?])
|
some string string? take take-nth take-while zero? zipwith])
|
||||||
|
@ -199,3 +199,4 @@
|
|||||||
(.append ret
|
(.append ret
|
||||||
`(setv ~name ~main)))
|
`(setv ~name ~main)))
|
||||||
ret))
|
ret))
|
||||||
|
|
||||||
|
@ -470,3 +470,12 @@
|
|||||||
(assert-equal res [None None])
|
(assert-equal res [None None])
|
||||||
(setv res (list (take-while (fn [x] (not (none? x))) [1 2 3 4 None 5 6 None 7])))
|
(setv res (list (take-while (fn [x] (not (none? x))) [1 2 3 4 None 5 6 None 7])))
|
||||||
(assert-equal res [1 2 3 4]))
|
(assert-equal res [1 2 3 4]))
|
||||||
|
|
||||||
|
(defn test-zipwith []
|
||||||
|
"NATIVE: testing the zipwith function"
|
||||||
|
(import operator)
|
||||||
|
(setv res (zipwith operator.add [1 2 3] [3 2 1]))
|
||||||
|
(assert-equal (list res) [4 4 4])
|
||||||
|
(setv res (zipwith operator.sub [3 7 9] [1 2 4]))
|
||||||
|
(assert-equal (list res) [2 5 5]))
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user