UPDATE на студии Android AVD:
Нет микроволн или лифтов:)
Использование некоторой старой школьной логики для практики для интервью.
Обмен номерами спереди назад. Используя два указателя
index[0] and index[last]
def reverse(array):
n = array
first = 0
last = len(array) - 1
while first < last:
holder = n[first]
n[first] = n[last]
n[last] = holder
first += 1
last -= 1
return n
input -> [-1 ,1, 2, 3, 4, 5, 6]
output -> [6, 1, 2, 3, 4, 5, -1]
def reverse(my_list):
L = len(my_list)
for i in range(L/2):
my_list[i], my_list[L-i - 1] = my_list[L-i-1], my_list[i]
return my_list
Наиболее прямым переводом вашего требования на Python является следующее for
утверждение:
for i in xrange(len(array) - 1, -1, -1):
print i, array[i]
Это довольно загадочно, но может оказаться полезным.
def reverse(text):
output = []
for i in range(len(text)-1, -1, -1):
output.append(text[i])
return output
Я нахожу (вопреки некоторым другим предположениям), что l.reverse()
- самый быстрый способ перевернуть длинный список в Python 3 и 2. Мне было бы интересно узнать, могут ли другие копировать эти моменты времени.
l[::-1]
, вероятно, медленнее, потому что он копирует список до его обращения. Добавление вызова list()
вокруг итератора, сделанного из reversed(l)
, должно добавить некоторые издержки. Конечно, если вам нужна копия списка или итератор, используйте эти соответствующие методы, но если вы хотите просто перевернуть список, то l.reverse()
, кажется, самый быстрый способ.
Функции
def rev_list1(l):
return l[::-1]
def rev_list2(l):
return list(reversed(l))
def rev_list3(l):
l.reverse()
return l
Список
l = list(range(1000000))
Время Python 3.5
timeit(lambda: rev_list1(l), number=1000)
# 6.48
timeit(lambda: rev_list2(l), number=1000)
# 7.13
timeit(lambda: rev_list3(l), number=1000)
# 0.44
Время Python 2.7
timeit(lambda: rev_list1(l), number=1000)
# 6.76
timeit(lambda: rev_list2(l), number=1000)
# 9.18
timeit(lambda: rev_list3(l), number=1000)
# 0.46
Использование обратного (массива) будет, вероятно, лучшим маршрутом.
>>> array = [1,2,3,4]
>>> for item in reversed(array):
>>> print item
Если вам нужно понять, как можно реализовать это, не используя встроенный reversed
.
def reverse(a):
midpoint = len(a)/2
for item in a[:midpoint]:
otherside = (len(a) - a.index(item)) - 1
temp = a[otherside]
a[otherside] = a[a.index(item)]
a[a.index(item)] = temp
return a
Это должно занять O (N) время.
В Python порядок списков также можно манипулировать с помощью сортировки , упорядочивая переменные в числовом / алфавитном порядке:
print(sorted(my_list))
my_list.sort(), print(my_list)
Вы можете сортировать с флагом «reverse = True» :
print(sorted(my_list, reverse=True))
или
my_list.sort(reverse=True), print(my_list)
Возможно, вы не хотите сортировать значения, а только наоборот. Тогда мы можем сделать это следующим образом:
print(list(reversed(my_list)))
** Числа имеют приоритет над алфавитом в порядке листинга. Организация значений Python потрясающая.
>>> L = [0,10,20,40]
>>> L.reverse()
>>> L
[40, 20, 10, 0]
Или
>>> L[::-1]
[40, 20, 10, 0]
Другое решение состояло бы в том, чтобы использовать numpy.flip для этого
import numpy as np
array = [0, 10, 20, 40]
list(np.flip(array))
[40, 20, 10, 0]