Хотя это «менее эффективно». И вы не можете делать операции нарезки на нем.
Якоб Бауэр
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.
В Python 3 это создает объект без списка range, который эффективно работает как список только для чтения (но использует намного меньше памяти, особенно для больших диапазонов).
Можете ли вы объяснить это, а также вы можете порекомендовать мне любой веб-сайт / 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).
Для тех, кто интересуется «эффективностью» собранных пока вариантов ...
Ответ Jaime RGP в привел меня перезагрузить компьютер после синхронизации на несколько «оспаривалась» решение Джейсона буквально следующее мое собственное предложение (через комментарии). Чтобы избавить вас от любопытного простоя, я представлю здесь свои результаты (в худшем случае):
Нет смысла использовать, reverseпотому что метод диапазона может возвращать обратный список.
Если у вас есть итерация по n элементам и вы хотите изменить порядок возвращаемого списка, range(start, stop, step)вы должны использовать третий параметр диапазона, который идентифицирует stepи устанавливает его -1, другие параметры должны быть соответствующим образом скорректированы:
Укажите параметр stop as -1(это предыдущее значение stop - 1, stopбыло равно 0).
В качестве параметра запуска используйте n-1.
Таким образом, эквивалент диапазона (n) в обратном порядке будет:
Честно говоря, я нахожу это менее интуитивным, чем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
хорошо иметь несколько цифр :) - почему ты тоже не добавил 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]
Мне действительно нравится тройка.-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 () - диапазон (начало, конец, увеличение / уменьшение), где начало включено, конец является исключением, а приращение может быть любым числом и ведет себя как шаг
Очень часто задаваемый вопрос: range(9, -1, -1)лучше ли, чем reversed(range(10))в Python 3? Люди, которые работали на других языках с итераторами, сразу же склонны думать, что метод reversed () должен кэшировать все значения и затем возвращаться в обратном порядке. Дело в том, что reversed()оператор Python не работает, если объект является просто итератором. Объект должен иметь один из двух ниже, чтобы reversed () работал:
Либо поддержка len()и целочисленные индексы через[]
Или есть __reversed__()метод реализован.
Если вы попытаетесь использовать reversed () для объекта, который не имеет ничего из вышеперечисленного, вы получите:
>>>[reversed((x for x in range(10)))]TypeError:'generator' object isnot reversible
Короче говоря, Python reversed()предназначен только для массивов, подобных объектам, и поэтому он должен иметь такую же производительность, что и прямая итерация.
Но как насчет range()? Разве это не генератор? В Python 3 это генератор, но обернутый в класс, который реализует оба из вышеупомянутых. Так range(100000)что не занимает много памяти, но поддерживает эффективную индексацию и реверсирование.
Таким образом, в итоге, вы можете использовать reversed(range(10))без какого-либо ущерба для производительности.
Ваш ответ показывает, почему reversed(range(10))менее подвержен ошибкам. Без обид Асинокс. Просто честное наблюдение.
Михал Шрайер
Я не знаю, стандартно ли оставлять ошибочные ответы на дисплее. Могу ли я или кто-то исправить это или даже удалить это?
синеконата
3
@ sine, нет, просто оставь это и удивляйся, как это накапливало 3 отзыва ... Я полагаю, ты мог пометить его для внимания модератора (дубликат ответа от 18 месяцев назад, за исключением неработающего), не уверенный, удалят ли они его или нет.
Вам не обязательно использовать функцию range, вы можете просто сделать list [:: - 1], который должен быстро вернуть список в обратном порядке, без каких-либо дополнений.
Похоже, что это решение, предложенное в предыдущем ответе . Также возможно, что вы пытаетесь прокомментировать другой предыдущий ответ - вам нужно получить немного больше репутации, прежде чем вы сможете это сделать.
Гриша Левит
1
Предположим, у вас есть список, который называется a = {1,2,3,4,5} Теперь, если вы хотите напечатать список в обратном порядке, просто используйте следующий код.
a.reverse
for i in a:print(i)
Я знаю, что вы спросили, используя диапазон, но он уже ответил.
Вы не получите случай 0. Например, допустим, что ваши 10 не являются магическими числами, а переменная, которую вы используете для поиска, начинается с обратного. Если ваш n регистр равен 0, обратный (диапазон (0)) не будет выполнен, что неправильно, если у вас случайно есть один объект в нулевом индексе.
Я подумал, что многие (как и я) могли бы больше интересоваться общим случаем обхода существующего списка в обратном порядке , как это указано в заголовке, а не просто генерированием индексов для такого обхода.
Несмотря на то, что все правильные ответы по-прежнему идеально подходят для этого случая, я хочу отметить, что сравнение производительности, выполненное в ответе Вольфа, предназначено только для генерации индексов. Поэтому я сделал аналогичный тест для обхода существующего списка в обратном порядке.
%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
Ответы:
использовать
reversed()
функцию:Это намного более значимо.
Обновить:
Если вы хотите, чтобы это был список (как указал btk):
Обновить:
Если вы хотите использовать только
range
для достижения того же результата, вы можете использовать все его параметры.range(start, stop, step)
Например, чтобы создать список
[5,4,3,2,1,0]
, вы можете использовать следующее:Это может быть менее интуитивно, но, как отмечают комментарии, это более эффективно и правильное использование диапазона для обратного списка.
источник
range(10)
, нетrange(9)
. Также, если вам нужен полностью сформированный список (для нарезки и т. Д.), Вам следует это сделатьlist(reversed(range(10)))
.reversed
вообще не принимает генераторы, но принимаетrange
. Зачемreversed(range(10000))
нужно было выделять память на весь список?range
может вернуть объект, который реализует__reversed__
метод, который позволяет эффективную обратную итерацию?Используйте встроенную функцию range. Подпись есть
range(start, stop, step)
. Это создает последовательность, которая возвращает числа, начиная сstart
и заканчивая, еслиstop
она была достигнута, за исключениемstop
.В Python 3 это создает объект без списка
range
, который эффективно работает как список только для чтения (но использует намного меньше памяти, особенно для больших диапазонов).источник
help(range)
оболочку Python, она сообщит вам аргументы. Это число, с которого нужно начинать, число, которое заканчивается (исключение), и шаг, который нужно предпринять, поэтому он начинается с 9 и вычитает 1, пока не достигнет -1 (в этот момент он останавливается, не возвращаясь, поэтому диапазон заканчивается на 0)range(start, stop, step)
- начинать с числаstart
и давать результаты, если ониstop
не были достигнуты, перемещаясьstep
каждый раз.Вы можете использовать
range(10)[::-1]
то же самое, чтоrange(9, -1, -1)
и, возможно, более читабельно (если вы знакомы с общейsequence[::-1]
идиомой Python).источник
Для тех, кто интересуется «эффективностью» собранных пока вариантов ...
Ответ Jaime RGP в привел меня перезагрузить компьютер после синхронизации на несколько «оспаривалась» решение Джейсона буквально следующее мое собственное предложение (через комментарии). Чтобы избавить вас от любопытного простоя, я представлю здесь свои результаты (в худшем случае):
Ответ Джейсона (может быть, просто экскурсия в силу понимания списка ):
Ответ Мартино (читается, если вы знакомы с синтаксисом расширенных слайсов ):
Ответ Михаила Шрайера (принятый, очень читабельный):
Ответ Бене (самый первый, но очень схематичный в то время ):
Последний вариант легко запомнить, используя
range(n-1,-1,-1)
обозначение Val Neekman .источник
решит эту проблему. Он выведет 8 к 1, а -1 означает перевернутый список
источник
Нет смысла использовать,
reverse
потому что метод диапазона может возвращать обратный список.Если у вас есть итерация по n элементам и вы хотите изменить порядок возвращаемого списка,
range(start, stop, step)
вы должны использовать третий параметр диапазона, который идентифицируетstep
и устанавливает его-1
, другие параметры должны быть соответствующим образом скорректированы:-1
(это предыдущее значениеstop - 1
,stop
было равно0
).n-1
.Таким образом, эквивалент диапазона (n) в обратном порядке будет:
источник
reversed(range(n))
Читаем в стороне,
reversed(range(n))
кажется, быстрее, чемrange(n)[::-1]
.Просто если кому было интересно :)
источник
range(1000000000-1,-1,-1)
?timeit range(1000000000-1,-1,-1)
в командной строке, вместо этого посмотрите мои результаты :-)Требование в этом вопросе требует
list
целых чисел размера 10 в порядке убывания. Итак, давайте создадим список в Python.источник
-1
Именно этот паттерн позволяет легко его сохранить.wrap one's head around this
Сегодня я узнал, что если он действительно должен быть эффективным , используйте егоrange(n-1, -1, -1)
при обходе диапазона в обратном порядке.Вы можете печатать обратные числа с помощью range () BIF Like,
Выход будет [10,9,8,7,6,5,4,3,2,1]
range () - диапазон (начало, конец, увеличение / уменьшение), где начало включено, конец является исключением, а приращение может быть любым числом и ведет себя как шаг
источник
Очень часто задаваемый вопрос:
range(9, -1, -1)
лучше ли, чемreversed(range(10))
в Python 3? Люди, которые работали на других языках с итераторами, сразу же склонны думать, что метод reversed () должен кэшировать все значения и затем возвращаться в обратном порядке. Дело в том, чтоreversed()
оператор Python не работает, если объект является просто итератором. Объект должен иметь один из двух ниже, чтобы reversed () работал:len()
и целочисленные индексы через[]
__reversed__()
метод реализован.Если вы попытаетесь использовать reversed () для объекта, который не имеет ничего из вышеперечисленного, вы получите:
Короче говоря, Python
reversed()
предназначен только для массивов, подобных объектам, и поэтому он должен иметь такую же производительность, что и прямая итерация.Но как насчет
range()
? Разве это не генератор? В Python 3 это генератор, но обернутый в класс, который реализует оба из вышеупомянутых. Такrange(100000)
что не занимает много памяти, но поддерживает эффективную индексацию и реверсирование.Таким образом, в итоге, вы можете использовать
reversed(range(10))
без какого-либо ущерба для производительности.источник
я верю, что это может помочь,
ниже Использование:
источник
источник
reversed(range(10))
менее подвержен ошибкам. Без обид Асинокс. Просто честное наблюдение.Использование без [:: - 1] или наоборот -
источник
"python!"[::-1]
?источник
Вам не обязательно использовать функцию range, вы можете просто сделать list [:: - 1], который должен быстро вернуть список в обратном порядке, без каких-либо дополнений.
источник
Предположим, у вас есть список, который называется a = {1,2,3,4,5} Теперь, если вы хотите напечатать список в обратном порядке, просто используйте следующий код.
Я знаю, что вы спросили, используя диапазон, но он уже ответил.
источник
Это правильная форма. Если вы используете
Вы не получите случай 0. Например, допустим, что ваши 10 не являются магическими числами, а переменная, которую вы используете для поиска, начинается с обратного. Если ваш n регистр равен 0, обратный (диапазон (0)) не будет выполнен, что неправильно, если у вас случайно есть один объект в нулевом индексе.
источник
Я подумал, что многие (как и я) могли бы больше интересоваться общим случаем обхода существующего списка в обратном порядке , как это указано в заголовке, а не просто генерированием индексов для такого обхода.
Несмотря на то, что все правильные ответы по-прежнему идеально подходят для этого случая, я хочу отметить, что сравнение производительности, выполненное в ответе Вольфа, предназначено только для генерации индексов. Поэтому я сделал аналогичный тест для обхода существующего списка в обратном порядке.
TL; DR
a[::-1]
самый быстрый.Предпосылки:
Ответ Джейсона :
Ответ Мартино :
Михал Шрайер ответил :
Ответ бене :
Как видите, в этом случае нет необходимости явно генерировать индексы, поэтому самый быстрый метод - это тот, который выполняет меньше дополнительных действий.
NB: я тестировал в JupyterLab, у которого есть удобная «волшебная команда»
%timeit
. Используется стандартtimeit.timeit
под капотом. Протестировано на Python 3.7.3источник