Распечатать список в обратном порядке с помощью range ()?

364

Как вы можете создать следующий список range()в Python?

[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
ramesh.mimit
источник
А как насчет [* range (9, -1, -1)]? Супер питоник!
онофрикамила

Ответы:

561

использовать reversed()функцию:

reversed(range(10))

Это намного более значимо.

Обновить:

Если вы хотите, чтобы это был список (как указал btk):

list(reversed(range(10)))

Обновить:

Если вы хотите использовать только rangeдля достижения того же результата, вы можете использовать все его параметры.range(start, stop, step)

Например, чтобы создать список [5,4,3,2,1,0], вы можете использовать следующее:

range(5, -1, -1)

Это может быть менее интуитивно, но, как отмечают комментарии, это более эффективно и правильное использование диапазона для обратного списка.

Михал Шрайер
источник
13
Хотя это «менее эффективно». И вы не можете делать операции нарезки на нем.
Якоб Бауэр
6
Этот ответ очень ясен и прост для понимания, но так и должно быть range(10), нет range(9). Также, если вам нужен полностью сформированный список (для нарезки и т. Д.), Вам следует это сделать list(reversed(range(10))).
Джон Y
5
Это создает итератор, OP запросил результат в виде списка.
БТК
6
Использование «обратного» с генератором Python (при условии, что мы говорим о встроенном диапазоне Python 3) просто концептуально неправильно и учит неправильным привычкам не учитывать сложность памяти / обработки при программировании на языке высокого уровня.
thedk
7
В Python3 reversedвообще не принимает генераторы, но принимает range. Зачем reversed(range(10000))нужно было выделять память на весь список? rangeможет вернуть объект, который реализует __reversed__метод, который позволяет эффективную обратную итерацию?
Авмохан
312

Используйте встроенную функцию range. Подпись есть range(start, stop, step). Это создает последовательность, которая возвращает числа, начиная с startи заканчивая, если stopона была достигнута, за исключением stop.

>>> range(9,-1,-1)   
    [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> range(-2, 6, 2)
    [-2, 0, 2, 4]

В Python 3 это создает объект без списка range, который эффективно работает как список только для чтения (но использует намного меньше памяти, особенно для больших диапазонов).

Мистер Б
источник
1
Можете ли вы объяснить это, а также вы можете порекомендовать мне любой веб-сайт / PDF-книгу для Python
ramesh.mimit
8
@ramesh Если вы запустите help(range)оболочку Python, она сообщит вам аргументы. Это число, с которого нужно начинать, число, которое заканчивается (исключение), и шаг, который нужно предпринять, поэтому он начинается с 9 и вычитает 1, пока не достигнет -1 (в этот момент он останавливается, не возвращаясь, поэтому диапазон заканчивается на 0)
Майкл Мрозек
3
@ ramesh.mimit: Просто зайдите на официальный сайт Python. Там есть полная документация, в том числе отличный учебник.
Джон Y
5
Действительно, это правильный ответ, но его можно объяснить более четко. range(start, stop, step) - начинать с числа startи давать результаты, если они stopне были достигнуты, перемещаясь stepкаждый раз.
Мистер Б.
43

Вы можете использовать range(10)[::-1]то же самое, что range(9, -1, -1)и, возможно, более читабельно (если вы знакомы с общей sequence[::-1]идиомой Python).

Мартино
источник
28

Для тех, кто интересуется «эффективностью» собранных пока вариантов ...

Ответ Jaime RGP в привел меня перезагрузить компьютер после синхронизации на несколько «оспаривалась» решение Джейсона буквально следующее мое собственное предложение (через комментарии). Чтобы избавить вас от любопытного простоя, я представлю здесь свои результаты (в худшем случае):

Ответ Джейсона (может быть, просто экскурсия в силу понимания списка ):

$ python -m timeit "[9-i for i in range(10)]"
1000000 loops, best of 3: 1.54 usec per loop

Ответ Мартино (читается, если вы знакомы с синтаксисом расширенных слайсов ):

$ python -m timeit "range(10)[::-1]"
1000000 loops, best of 3: 0.743 usec per loop

Ответ Михаила Шрайера (принятый, очень читабельный):

$ python -m timeit "reversed(range(10))"
1000000 loops, best of 3: 0.538 usec per loop

Ответ Бене (самый первый, но очень схематичный в то время ):

$ python -m timeit "range(9,-1,-1)"
1000000 loops, best of 3: 0.401 usec per loop

Последний вариант легко запомнить, используя range(n-1,-1,-1)обозначение Val Neekman .

волк
источник
3
Я прочитал этот ответ сам и получил те же результаты.
Тодд Оуэн
13
for i in range(8, 0, -1)

решит эту проблему. Он выведет 8 к 1, а -1 означает перевернутый список

Ютта
источник
10

Нет смысла использовать, reverseпотому что метод диапазона может возвращать обратный список.

Если у вас есть итерация по n элементам и вы хотите изменить порядок возвращаемого списка, range(start, stop, step)вы должны использовать третий параметр диапазона, который идентифицирует stepи устанавливает его -1, другие параметры должны быть соответствующим образом скорректированы:

  1. Укажите параметр stop as -1(это предыдущее значение stop - 1, stopбыло равно 0).
  2. В качестве параметра запуска используйте n-1.

Таким образом, эквивалент диапазона (n) в обратном порядке будет:

n = 10
print range(n-1,-1,-1) 
#[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Андрей Иванейко
источник
6
Честно говоря, я нахожу это менее интуитивным, чемreversed(range(n))
Николас Гамильтон
1
@NicholasHamilton Согласен с вами, однако идея этого ответа заключается в том, чтобы использовать меньше ресурсов ... (и вопрос был об использовании только функции дальности :))
Андрей Иванейко
Хорошо, не беспокойтесь, я думаю, это зависит от ситуации. Например, если функция диапазона используется в качестве индекса для цикла, то она будет иметь ограниченный эффект, однако, если она будет использоваться во внешнем цикле, тогда стоимость будет составлять ...
Николас Гамильтон
8

Читаем в стороне, reversed(range(n))кажется, быстрее, чем range(n)[::-1].

$ python -m timeit "reversed(range(1000000000))"
1000000 loops, best of 3: 0.598 usec per loop
$ python -m timeit "range(1000000000)[::-1]"
1000000 loops, best of 3: 0.945 usec per loop

Просто если кому было интересно :)

Хайме RGP
источник
хорошо иметь несколько цифр :) - почему ты тоже не добавил range(1000000000-1,-1,-1)?
Волк
... лучше не пробовать timeit range(1000000000-1,-1,-1)в командной строке, вместо этого посмотрите мои результаты :-)
Wolf
6

Требование в этом вопросе требует listцелых чисел размера 10 в порядке убывания. Итак, давайте создадим список в Python.

# This meets the requirement.
# But it is a bit harder to wrap one's head around this. right?
>>> range(10-1, -1, -1)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

# let's find something that is a bit more self-explanatory. Sounds good?
# ----------------------------------------------------

# This returns a list in ascending order.
# Opposite of what the requirement called for.
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# This returns an iterator in descending order.
# Doesn't meet the requirement as it is not a list.
>>> reversed(range(10))
<listreverseiterator object at 0x10e14e090>

# This returns a list in descending order and meets the requirement
>>> list(reversed(range(10)))
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
un33k
источник
2
Мне действительно нравится тройка.-1 Именно этот паттерн позволяет легко его сохранить. wrap one's head around thisСегодня я узнал, что если он действительно должен быть эффективным , используйте его range(n-1, -1, -1)при обходе диапазона в обратном порядке.
Волк
5

Вы можете печатать обратные числа с помощью range () BIF Like,

for number in range ( 10 , 0 , -1 ) :
    print ( number ) 

Выход будет [10,9,8,7,6,5,4,3,2,1]

range () - диапазон (начало, конец, увеличение / уменьшение), где начало включено, конец является исключением, а приращение может быть любым числом и ведет себя как шаг

Г-н Сурия Джа
источник
5

Очень часто задаваемый вопрос: range(9, -1, -1)лучше ли, чем reversed(range(10))в Python 3? Люди, которые работали на других языках с итераторами, сразу же склонны думать, что метод reversed () должен кэшировать все значения и затем возвращаться в обратном порядке. Дело в том, что reversed()оператор Python не работает, если объект является просто итератором. Объект должен иметь один из двух ниже, чтобы reversed () работал:

  1. Либо поддержка len()и целочисленные индексы через[]
  2. Или есть __reversed__()метод реализован.

Если вы попытаетесь использовать reversed () для объекта, который не имеет ничего из вышеперечисленного, вы получите:

>>> [reversed((x for x in range(10)))]
TypeError: 'generator' object is not reversible

Короче говоря, Python reversed()предназначен только для массивов, подобных объектам, и поэтому он должен иметь такую ​​же производительность, что и прямая итерация.

Но как насчет range()? Разве это не генератор? В Python 3 это генератор, но обернутый в класс, который реализует оба из вышеупомянутых. Так range(100000)что не занимает много памяти, но поддерживает эффективную индексацию и реверсирование.

Таким образом, в итоге, вы можете использовать reversed(range(10))без какого-либо ущерба для производительности.

Шиталь шах
источник
3

я верю, что это может помочь,

range(5)[::-1]

ниже Использование:

for i in range(5)[::-1]:
    print i 
dineshsprabu
источник
3
range(9,-1,-1)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Asinox
источник
13
Ваш ответ показывает, почему reversed(range(10))менее подвержен ошибкам. Без обид Асинокс. Просто честное наблюдение.
Михал Шрайер
Я не знаю, стандартно ли оставлять ошибочные ответы на дисплее. Могу ли я или кто-то исправить это или даже удалить это?
синеконата
3
@ sine, нет, просто оставь это и удивляйся, как это накапливало 3 отзыва ... Я полагаю, ты мог пометить его для внимания модератора (дубликат ответа от 18 месяцев назад, за исключением неработающего), не уверенный, удалят ли они его или нет.
О.Г.Хаза,
Для справки в будущем: код только не VLQ , и неправильные ответы также не должны быть помечены . Приглушай и двигайся дальше, но пометка неправильная в этом случае, будь то NAA или мод-пометка. - Из обзора
Зои
2

Использование без [:: - 1] или наоборот -

def reverse(text):
    result = []
    for index in range(len(text)-1,-1,-1):
        c = text[index]
        result.append(c)
    return ''.join(result)

print reverse("python!")
rhel.user
источник
6
Почему кто-то должен писать это вместо "python!"[::-1]?
Даниэль
1
[9-i for i in range(10)]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Джейсон
источник
1

Вам не обязательно использовать функцию range, вы можете просто сделать list [:: - 1], который должен быстро вернуть список в обратном порядке, без каких-либо дополнений.

user7420740
источник
Похоже, что это решение, предложенное в предыдущем ответе . Также возможно, что вы пытаетесь прокомментировать другой предыдущий ответ - вам нужно получить немного больше репутации, прежде чем вы сможете это сделать.
Гриша Левит
1

Предположим, у вас есть список, который называется a = {1,2,3,4,5} Теперь, если вы хотите напечатать список в обратном порядке, просто используйте следующий код.

a.reverse
for i in a:
   print(i)

Я знаю, что вы спросили, используя диапазон, но он уже ответил.

Вишал Кумар
источник
0
range(9,-1,-1)
    [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

Это правильная форма. Если вы используете

reversed(range(10))

Вы не получите случай 0. Например, допустим, что ваши 10 не являются магическими числами, а переменная, которую вы используете для поиска, начинается с обратного. Если ваш n регистр равен 0, обратный (диапазон (0)) не будет выполнен, что неправильно, если у вас случайно есть один объект в нулевом индексе.

user3807372
источник
0

Я подумал, что многие (как и я) могли бы больше интересоваться общим случаем обхода существующего списка в обратном порядке , как это указано в заголовке, а не просто генерированием индексов для такого обхода.

Несмотря на то, что все правильные ответы по-прежнему идеально подходят для этого случая, я хочу отметить, что сравнение производительности, выполненное в ответе Вольфа, предназначено только для генерации индексов. Поэтому я сделал аналогичный тест для обхода существующего списка в обратном порядке.

TL; DR a[::-1] самый быстрый.

Предпосылки:

a = list(range(10))

Ответ Джейсона :

%timeit [a[9-i] for i in range(10)]
1.27 µs ± 61.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Ответ Мартино :

%timeit a[::-1]
135 ns ± 4.07 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

Михал Шрайер ответил :

%timeit list(reversed(a))
374 ns ± 9.87 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Ответ бене :

%timeit [a[i] for i in range(9, -1, -1)]
1.09 µs ± 11.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Как видите, в этом случае нет необходимости явно генерировать индексы, поэтому самый быстрый метод - это тот, который выполняет меньше дополнительных действий.

NB: я тестировал в JupyterLab, у которого есть удобная «волшебная команда» %timeit. Используется стандарт timeit.timeitпод капотом. Протестировано на Python 3.7.3

pkuderov
источник