Created
November 4, 2018 14:19
-
-
Save msoedov/0b108966e9dfa2bd9365324b46dbde5b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
Given two 1d vectors, implement an iterator to return their elements alternately. | |
For example, given two 1d vectors: | |
v1 = [1, 2] | |
v2 = [3, 4, 5, 6] | |
By calling next repeatedly until hasNext returns false, the order of elements returned by next should be: [1, 3, 2, 4, 5, 6]. | |
Follow up: What if you are given k 1d vectors? How well can your code be extended to such cases? | |
Clarification for the follow up question - Update (2015-09-18): | |
The "Zigzag" order is not clearly defined and is ambiguous for k > 2 cases. If "Zigzag" does not look right to you, replace "Zigzag" with "Cyclic". For example, given the following input: | |
[1,2,3] | |
[4,5,6,7] | |
[8,9] | |
It should return [1,4,8,2,5,9,3,6,7]. | |
""" | |
from itertools import zip_longest | |
given = [[1, 2, 3], [4, 5, 6, 7], [8, 9]] | |
expected = [1, 4, 8, 2, 5, 9, 3, 6, 7] | |
def zig_zag(iters: [list]) -> list: | |
return [x for x in sum(map(list, zip_longest(*iters)), []) if x is not None] | |
print(zig_zag(given)) | |
assert zig_zag(given) == expected |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment