Можно создать дубликат:
Traverse a list in reverse order in PythonКак отменить кортежи в Python?
Возможно ли это? Не нужно быть на месте, просто ищет способ изменить кортеж, чтобы я мог повторять его в обратном порядке.
Можно создать дубликат:
Traverse a list in reverse order in PythonКак отменить кортежи в Python?
Возможно ли это? Не нужно быть на месте, просто ищет способ изменить кортеж, чтобы я мог повторять его в обратном порядке.
Есть два идиоматических способа сделать это:
reversed(x) # returns an iterator
или
x[::-1] # returns a new tuple
Поскольку кортежи неизменны, нет никакого способа, чтобы отменить кортеж на месте.
Edit: Опираясь на комментарий @ НОП, в итератор, возвращаемый reversed
будет эквивалентно
def myreversed(seq):
for i in range(len(x) - 1, -1, -1):
yield seq[i]
т.е. она опирается на последовательности, имеющей известную длину, чтобы избежать того, чтобы на самом деле реверс кортеж.
Как который является более эффективным, я бы подозреваю, что это было бы seq[::-1]
, если вы используете все эти и кортеж мал, и reversed
когда кортеж велик, но производительность в питоне часто удивительно так измерить его!
Спасибо, какой будет быстрее? Похоже, что итератор выполняет итерацию по требованию? Если да, то как это сделать эффективно, не меняя сначала список? Он реверсируется каждый раз, когда он итерации? –
@JoanVenge 'reverseed' использует тот факт, что' tuple '- это последовательности, которые начинаются в конце и работают назад, давая каждому элементу по требованию, отслеживая, где он находится. – lvc
@JoanVenge see my edit (ty lvc, только что расширил ваш комментарий) – tobyodavies
Вы можете использовать встроенную функцию reversed
.
>>> x = (1, 2, 3, 4)
>>> y = reversed(x)
>>> tuple(y)
(4, 3, 2, 1)
Если вы просто хотите перебрать кортеж, вы можете просто использовать итератор, возвращаемый reversed
напрямую, без преобразования его в кортеж снова.
>>> for k in reversed(x):
... print k,
...
4 3 2 1
Подобно тому, как вы бы полностью изменить список, т.е. s [:: - 1]
In [20]: s = (1, 2, 3)
In [21]: s[::-1]
Out[21]: (3, 2, 1)
и
In [24]: for i in s[::-1]:
....: print i
....:
3
2
1
Вы пробовали использовать 'reversed'? – Wes
Есть много дубликатов этого вопроса, но все они, кажется, спрашивают о строках или списках istead кортежей. Ответ тот же. Примеры: http://stackoverflow.com/questions/931092/reverse-a-string-in-python http://stackoverflow.com/questions/6827413/reverse-does-not-work-on-a-python-literal http://stackoverflow.com/questions/529424/traverse-a-list-in-reverse-order-in-python – agf
Спасибо, да, я не мог найти тот, который точно говорит об обращении кортежей, но я понимаю, что вы имеете в виду. –