2013-08-19 12 views
6

Per qualche codice che sto scrivendo, ho bisogno di iterare 1-30 saltare 6. Quello che ho cercato ingenuamente èCome posso combinare range() funzioni

a = range(1,6) 
b = range(7,31) 

for i in a+b: 
    print i 

C'è un modo per farlo più in modo efficiente?

+5

Cosa avete pubblicato opere. Cosa stai chiedendo esattamente? C'è un modo per farlo 'meglio'? –

+1

Quanto sopra funziona in python2, ma non in python3 –

risposta

10

in Python 2 non si conciliano "funzioni di gamma"; questi sono solo elenchi. Il tuo esempio funziona bene. Ma variare crea sempre un elenco completo in memoria, quindi un modo migliore se necessaria solo nel ciclo for potrebbe essere quella di utilizzare un generatore di espressione e xrange:

range_with_holes = (j for j in xrange(1, 31) if j != 6) 

for i in range_with_holes: 
    .... 

Nel generatore di espressione del se una parte può contenere una logica complessa su quali numeri saltare.

Un altro modo di combinare iterables è quello di utilizzare il itertools.chain:

range_with_holes = itertools.chain(xrange(1, 6), xrange(7, 31)) 

O semplicemente saltare l'indice indesiderato

for i in range(1, 31): 
    if i == 6: 
     continue 

    ... 
2

Una possibilità sarebbe quella di utilizzare un elenco di salto, e verificare contro che, con qualcosa come:

skips = [6, 42] 
for i in range(1,31): 
    if i in skips: 
     continue 
    print i 
10

Uso itertools.chain:

import itertools 

a = range(1,6) 
b = range(7,31) 

for i in itertools.chain(a, b): 
    print i 

O difficili espressioni generatore appiattimento:

a = range(1,6) 
b = range(7,31) 
for i in (x for y in (a, b) for x in y): 
    print i 

Oppure saltare in un'espressione di generatore:

skips = set((6,)) 
for i in (x for x in range(1, 31) if x not in skips): 
    print i 

Ognuna di queste funziona per qualsiasi iterabile (s), non solo range s in Python 3 o lists s in Python 2.