
FYI, itertools.compress() is very useful in conjunction with itertools.cycle() to pick out elements following a periodic pattern of indices. For example, # Elements at even indices.
list(compress(range(20), cycle([1, 0]))) [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# Or at odd ones.
list(compress(range(20), cycle([0, 1]))) [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
# Pick every third.
list(compress(range(20), cycle([0, 0, 1]))) [2, 5, 8, 11, 14, 17]
# Omit every third.
list(compress(range(20), cycle([1, 1, 0]))) [0, 1, 3, 4, 6, 7, 9, 10, 12, 13, 15, 16, 18, 19]
For arguments that are re-iteraerable, there are several ways to get the proposed semantics, including just passing the argument twice to compress():
a = [None, "", "-filove-python", "CFLAGS=-O3"] " ".join(compress(a, a)) '-filove-python CFLAGS=-O3'