【问题标题】:List slice python列表切片python
【发布时间】:2017-06-24 12:47:09
【问题描述】:

我正在尝试对列表进行快速排序,并希望这样做。

我有以下代码并且想知道一般情况(这个问题经常出现,因为我试图解决实际列表中的列表问题,而不是复杂的返回序列或使用奇怪的索引)列表可以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)))

【问题讨论】:

  • 列表切片始终是副本。这就是为什么l[:] 是复制整个列表的习惯用法。
  • 那么有没有办法让这样的代码工作?我真的可以使用列表切片以某种方式指向列表 A 中的元素吗?
  • quickSort 函数的参数数量存在差异
  • 提示:python 中没有临时变量的惯用交换:A[i], A[j] = A[j], A[i]

标签: python list sorting slice quicksort


【解决方案1】:

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]

a slice of a python list 总是返回一个副本,因此您必须自己在列表上编写视图...

【讨论】:

  • 你太棒了!完美地工作,我从来没有想过使用 numpy 来完成这样的任务。谢谢谢谢谢谢。
猜你喜欢
  • 2015-02-19
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 2014-11-02
  • 1970-01-01
相关资源
最近更新 更多