Modul itertools

from itertools import *
from time import time

every_third = cycle([False, False, True])
data = range(1, 10)

for i in compress(data, every_third):
    print(i, end=' ')
print()

# iteriert endlos über 0,1,...,10,9,8,...,1
cnt = 0
for i in cycle(chain(range(10), range(10, 0, -1))):
    cnt += 1
    if cnt > 30:
        # Stopp nach 30 Ausgaben
        print()
        break
    print(i, end = ' ')

# gruppiert die Elemente einer Sequenz; beseitigt bei sortierten Sequenzen
# Dubletten in den Keys und ordnet ihnen jeweils die Anzahl des Auftretens zu
a = sorted((1, 4, 5, 4, 9, 1, 2, 3, 4, 5, 1))
b = [k for k, g in groupby(a)]   # b = [1,2,3,4,5,9]
print(b)

# 
for k, g in groupby(a):
    print(k, len(list(g)))
# 1 3
# 2 1
# 3 1
# 4 3
# 5 2
# 9 1

print('set/frozenset statt groupby')
print(sorted(set(a)))
print(sorted(frozenset(a)))

# iteriert über dem Kartesischen Produkt von a und b
a = [1, 2, 3, 4, 5]
b = [10, 11, 12]
for pair in product(a, b):
    print(pair)
# (1,10),(1,11),(1,12), ... (5,10),(5,11),(5,12)

# Zeitmessung repeat und range
for n in 10_000_00, 1_000_000, 100_000, 20_000:
    print('n =', n)
    for func in repeat, range:
        start = time()
        for _ in func(0, n): pass
        end = time()
        print('Dauer: %.3f Sekunden' % (end - start))

print(list(accumulate(range(5))))
# [0, 1, 3, 6, 10] ==> [0, 0+1, 1+2, 3+3, 6+4]

print(list(accumulate('abcde')))
# ['a', 'ab', 'abc', 'abcd', 'abcde']

# Palindrome bilden
def f(a, b):
    print(a, b)
    return b + a + b

print(list(accumulate('abcde', f)))
# a b
# bab c
# cbabc d
# dcbabcd e
# ['a', 'bab', 'cbabc', 'dcbabcd', 'edcbabcde']