2012-04-18 3 views
36

Можно создать дубликат:
Traverse a list in reverse order in PythonКак отменить кортежи в Python?

Возможно ли это? Не нужно быть на месте, просто ищет способ изменить кортеж, чтобы я мог повторять его в обратном порядке.

+4

Вы пробовали использовать 'reversed'? – Wes

+0

Есть много дубликатов этого вопроса, но все они, кажется, спрашивают о строках или списках 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

+1

Спасибо, да, я не мог найти тот, который точно говорит об обращении кортежей, но я понимаю, что вы имеете в виду. –

ответ

87

Есть два идиоматических способа сделать это:

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 когда кортеж велик, но производительность в питоне часто удивительно так измерить его!

+0

Спасибо, какой будет быстрее? Похоже, что итератор выполняет итерацию по требованию? Если да, то как это сделать эффективно, не меняя сначала список? Он реверсируется каждый раз, когда он итерации? –

+2

@JoanVenge 'reverseed' использует тот факт, что' tuple '- это последовательности, которые начинаются в конце и работают назад, давая каждому элементу по требованию, отслеживая, где он находится. – lvc

+1

@JoanVenge see my edit (ty lvc, только что расширил ваш комментарий) – tobyodavies

9

Вы можете использовать встроенную функцию 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 
6

Подобно тому, как вы бы полностью изменить список, т.е. 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 
Смежные вопросы