5.11.1 Ricette

Questa sezione mostra vari approcci per lavorare con i deque.

Il metodo rotate() fornisce un modo per implementare l'affettamento e la cancellazione dei deque:

Quest'implementazione in puro python di del d[n] mostra l'utilizzo del metodo rotate() come base di partenza per implementare diverse operazioni di deque:

def delete_nth(d, n):
    d.rotate(-n)
    d.popleft()
    d.rotate(n)

Per implementare l'affettamento dei deque, si usa un approccio simile, applicando rotate() per portare l'elemento desiderato all'estremità sinistra del deque. Si rimuovono i vecchi elementi con popleft(), si aggiungono i nuovi elementi con extend(), quindi si inverte la rotazione.

Apportando variazioni minime a questo approccio è facile implementare manipolazioni di stack in stile Forth quali dup, drop, swap, over, pick, rot e roll.

Un task server roundrobin può essere costruito partendo da un deque ed usando popleft() per selezionare il task corrente ed append() per aggiungerlo in fondo alla tasklist se il flusso di input non si è esaurito:

def roundrobin(*iterables):
    pending = deque(iter(i) for i in iterables)
    while pending:
        task = pending.popleft()
        try:
            yield task.next()
        except StopIteration:
            continue
        pending.append(task)

>>> for value in roundrobin('abc', 'd', 'efgh'):
...     print value

a
d
e
b
f
c
g
h

Gli algoritmi di riduzione dei dati multi-pass possono essere espressi in maniera succinta e codificati efficentemente estraendo gli elementi mediante chiamate multiple a popleft(), applicando la funzione di riduzione ed usando append() per riporre il risultato nella queue.

Per esempio, la costruzione di un albero binario bilanciato di liste annidate si ottiene riducendo due nodi adiacenti ad uno solo raggruppandoli in una lista:

def maketree(iterable):
    d = deque(iterable)
    while len(d) > 1:
        pair = [d.popleft(), d.popleft()]
        d.append(pair)
    return list(d)

>>> print maketree('abcdefgh')
[[[['a', 'b'], ['c', 'd']], [['e', 'f'], ['g', 'h']]]]
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.