2017-02-07 5 views
1

Я пытаюсь быстро сортировать список и хочу сделать это на месте.Список slice python

У меня есть следующий код и вы хотите знать в целом (эта проблема часто возникает для меня, поскольку я пытаюсь решить проблемы с списком в фактическом списке, а не сложную последовательность возвратов или используя странные индексы), может list slice позволяет мне влиять на список, из которого он получен? Существуют ли более серьезные последствия для того, чтобы делать что-то подобное?

def partition(A,l,r): 
    p=A[l] 
    i=l+1 
    print(A) 
    for j in range(l+1,r): 
     if A[j]<p: 
      save=A[i] 
      A[i]=A[j] 
      A[j]=save 
      i+=1 
    save=A[i-1] 
    A[i-1]=A[l] 
    A[l]=save 
    return i-1 
def quickSort(A,n): 
    if n>1: 
     split=partition(A,0,n) 
     quickSort(A[:split],len(A[:split])) 
     quickSort(A[split+1:],len(A[split+1:])) 
     print(A) 
    return A 
A=[3,4,5,2,10,7,6,9,1] 
print(quickSort(A,len(A))) 
+2

Слайд списка всегда является копией. Вот почему 'l [:]' является идиомой для создания копии целого списка. – Barmar

+0

Так есть ли способ заставить код работать так? Могу ли я на самом деле указать на элементы в моем списке A, используя как-нибудь часть списка? –

+0

есть некорректность в количестве аргументов вашей функции 'quickSort' –

ответ

3

numpy позволяет назначить ломтики таким образом, что находит свое отражение в исходном массиве (numpy ломтиков вернуть views):

import numpy as np 

a = np.array(range(10)) 
print(a) # [0 1 2 3 4 5 6 7 8 9] 
b = a[3:7] 
print(b) # [3 4 5 6] 
b[0] = 33 
print(b) # [33 4 5 6] 
print(a) # [ 0 1 2 33 4 5 6 7 8 9] 

кусочек питона list всегда возвращает копию, так что вы бы необходимо написать мнение о списке самостоятельно ...

+0

Человек, ты потрясающий! работает отлично, и я бы никогда не думал о том, чтобы использовать numpy для такой задачи. Спасибо Спасибо спасибо. –

Смежные вопросы