2013-08-19 5 views
6

dla niektórych kodu piszę, muszę iteracyjne od 1-30 pomijanie 6. co starałem naiwnie jestJak mogę połączyć zakres() działa

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

for i in a+b: 
    print i 

Czy istnieje sposób, aby zrobić więcej wydajnie?

+5

Co masz zamieszczonych prac. O co dokładnie pytasz? Czy istnieje sposób, aby to zrobić "lepiej"? –

+1

Powyższe działa w python2, ale nie python3 –

Odpowiedz

10

W python 2 nie łączą "zakres funkcji"; to tylko listy. Twój przykład działa dobrze. Ale wahają się zawsze tworzy się pełna lista ogłoszeń w pamięci, więc lepszy sposób, jeśli tylko potrzebna w pętli for mogłoby być użycie wyrażenia generatora i XRange:

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

for i in range_with_holes: 
    .... 

generator ekspresja jeśli część może zawierać złożoną logikę które numery pominąć.

Innym sposobem, aby połączyć iterables jest użycie itertools.chain:

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

Albo po prostu pominąć niechciane indeks

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

    ... 
2

Jedną z opcji byłoby wykorzystanie listę pomijania i sprawdź przeciwko, że z czymś takim:

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

użytkowania itertools.chain:

import itertools 

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

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

Albo trudnych prądotwórczych spłaszczenie wyrażeń:

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

Lub pomijanie w wyrażeniu generatora:

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

Każda z nich będzie pracować dla dowolnego iterable (s), a nie tylko range s w Pythonie 3 lub lists s w Pythonie 2.