Невозможно изменить списки в Python, получив "Nonetype" в списке
У меня есть файл .py
, который берет список, находит самое низкое число, помещает его в новый массив, удаляет наименьшее число из первого массива и повторяет до тех пор, пока исходный массив не будет содержать больше элементов:
def qSort(lsort):
listlength = len(lsort)
sortedlist = list()
if listlength == 0:
return lsort
else:
while listlength > 0:
lmin = min(lsort)
sortedlist.append(lmin)
lsort.remove(lmin)
listlength = len(lsort)
return sortedlist
Теперь другой .py
файл импортирует qSort
и запускает его в некотором списке, сохраняя его в переменной. Затем я пытаюсь использовать команду .reverse()
в списке, и я получаю ее как NoneType
. Я пытаюсь использовать reversed()
, но все, что он делает, это сказать "<listreverseiterator object at 0xSomeRandomHex>"
:
from qSort import qSort #refer to my first Pastebin
qSort = qSort([5,42,66,1,24,5234,62])
print qSort #this prints the sorted list
print type(qSort) #this prints <type 'list'>
print qSort.reverse() #this prints None
print reversed(qSort) #this prints "<listreverseiterator object at 0xSomeRandomHex>"
Может кто-нибудь объяснить, почему я не могу повернуть вспять список, независимо от того, что я делаю?
Ответы
Ответ 1
Как упоминает jcomeau, функция .reverse()
изменяет список на месте. Он не возвращает список, а оставляет qSort
измененным.
Если вы хотите "вернуть" реверсивный список, чтобы его можно было использовать, как вы пытаетесь в своем примере, вы можете сделать срез с направлением -1
Итак, замените print qSort.reverse()
на print qSort[::-1]
Вы должны знать кусочки, полезные вещи. Я не видел места в учебнике, где все это описывалось сразу, (http://docs.python.org/tutorial/introduction.html#lists действительно не охватывает все), поэтому надеюсь, вот несколько иллюстративных примеров.
Синтаксис: a[firstIndexInclusive:endIndexExclusive:Step]
>>> a = range(20)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> a[7:] #seventh term and forward
[7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> a[:11] #everything before the 11th term
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> a[::2] # even indexed terms. 0th, 2nd, etc
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
>>> a[4:17]
[4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
>>> a[4:17:2]
[4, 6, 8, 10, 12, 14, 16]
>>> a[::-1]
[19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> a[19:4:-5]
[19, 14, 9]
>>> a[1:4] = [100, 200, 300] #you can assign to slices too
>>> a
[0, 100, 200, 300, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
Ответ 2
list.reverse() отменяет на месте и ничего не возвращает (None). поэтому вы не говорите:
mylist = mylist.reverse()
вы говорите:
mylist.reverse()
или, альтернативно:
mylist = list(reversed(mylist))
Ответ 3
Метод reverse()
list
сортирует список на месте и возвращает None
, чтобы напомнить вам об этом (согласно примечанию 7 в documentation). Встроенная функция reversed()
возвращает объект-итератор, который может быть превращен в объект list
, передав его функции-конструктора list()
следующим образом: list(reversed(qSort))
. Вы можете сделать то же самое, создав срез с размером шага отрицательного, чтобы он двигался назад, т.е. qSort[::-1]
.
BTW, list
также имеет метод sort()
(но будьте осторожны, он также возвращает None
; -).