Существует ли простой однострочный способ исключить первый элемент функции диапазона в Python?

#python #python-3.x

Вопрос:

Просто для пояснения, шаг также может быть отрицательным. В настоящее время я как раз этим и занимаюсь.

 def excl_range(start, end, step):
    if step > 0:
        return range(start   1, end, step)
    return range(start - 1, end, step)
 

Мне просто интересно, есть ли более чистый способ, предпочтительно без использования новой функции для этого.

Ответ №1:

Редко упоминаемый или используемый факт range заключается в том, что это полный тип последовательности в python 3. Это означает, что вы можете индексировать объекты напрямую, в том числе с помощью срезов:

 range(...)[1:]
 

Это эквивалентно увеличению start на step . Обратите внимание, что знак шага не имеет значения: второй элемент всегда start step по определению:

 range(start   step, end, step)
 

Вы также можете исключить элемент во время итерации:

 it = iter(range(...))
next(it)
for x in it:
    ...
 

Это работает для любой итерации, а не только range для нее . Вы можете сделать то же самое с itertools.islice :

 for x in islice(range(...), 1):
    ...
 

Комментарии:

1. Ах, это именно то, что я искал, диапазон(…)[1:], так как другие 2 точно не будут работать очень чисто в моем контексте. Большое вам спасибо, я приму его, как только смогу.

2. @SamTaaghol. Я также добавил гораздо более чистую версию вашей первоначальной попытки

3. Дело в том, что «шаг» очень длинный, и я немного помешан на линиях, пытаясь сделать его как можно более чистым, ха-ха. вот почему я прибегнул к использованию этой функции.

Ответ №2:

Вы могли бы подумать о том, чтобы сделать это вот так:-

 step = 1
start = 10
end = 100

for i in range(start   1 if step > 0 else start - 1, end, step):
    pass # your code goes here
 

Комментарии:

1. Только что понял, что вы можете нарезать диапазон напрямую

2. @darkknight Ты , наверное, имел в виду start step , что нет start 1 .

3. Кроме того, из-за этого нет никаких условий. Я добавил это к своему ответу сейчас

4. @Тьерри Латуйль Нет. Взгляните еще раз на код операции

5. Ну, исходный код операции неверен в этом аспекте и не делает того, что задается вопросом.