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?
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?
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
...
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
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.
Co masz zamieszczonych prac. O co dokładnie pytasz? Czy istnieje sposób, aby to zrobić "lepiej"? –
Powyższe działa w python2, ale nie python3 –