from itertools import islice
def grouper(iterable, n, min_chunk=1):
it = iter(iterable)
while True:
chunk = list(islice(it, n))
if len(chunk) < min_chunk:
return
yield chunk
def pick_skip_seq(seq, pick, skip, skip_first=False):
if skip_first:
ret = [ x[skip:] for x in grouper(seq, pick+skip, skip+1) ]
else:
ret = [ x[:pick] for x in grouper(seq, pick+skip) ]
return ret
pick_skip_seq(range(1,33), 3, 2)
gibt gewünschte Liste.
In pick_skip_seq(seq, pick, skip, skip_first=False)
, seq
ist Sequenz zu holen/skip aus, pick
/skip
nicht sind. von Elementen zum Aufnehmen/Überspringen, skip_first
ist zu setzen True
wenn ein solches Verhalten erwünscht ist.
liefert Chunks von n Elementen, es ignoriert letzte Gruppe, wenn es weniger als min_chunk Elemente hat. Es ist abgeleitet von Sachen gegeben in https://stackoverflow.com/a/8991553/1921546.
Demo:
# pick 3 skip 2
for i in range(30,35):
print(pick_skip_seq(range(1,i), 3, 2))
# skip 3 pick 2
for i in range(30,35):
print(pick_skip_seq(range(1,i), 3, 2, True))
Eine alternative Implementierung von pick_skip_seq
:
from itertools import chain,cycle,repeat,compress
def pick_skip_seq(seq, pick, skip, skip_first=False):
if skip_first:
c = cycle(chain(repeat(0, skip), repeat(1, pick)))
else:
c = cycle(chain(repeat(1, pick), repeat(0, skip)))
return list(grouper(compress(seq, c), pick))
Alle Dinge verwendet werden, hier dokumentiert: https://docs.python.org/3/library/itertools.html#itertools.compress
ich von 'annehmen [1-3]' Sie mean '[1,2,3]' –
Ich verstehe nicht, wie Sie die Sequenz definiert haben.Mit "nicht immer gleich" meinst du zufällig? Muss die Anzahl der jeweils gezeichneten Sequenzen gleich sein? –
Wer entscheidet über die Reihenfolge von "Take 3, Drop 2, Take 3, Drop 2, ..."? – Lagerbaer