6

我是 Python 的初学者,在不使用 append() 函数的情况下将元素插入数组时遇到了一些麻烦。

这是我的代码的一部分,我希望足以说明,但如果有帮助,请随时询问更多详细信息:

#other code
arr1 = []
arr2 = []
index1 = 0
index2 = 0

for i in range(0, len(A)):
    if A[i] < A[r]:
        arr1[index1] = A[i]
        index1 = index1 + 1
    elif A[i] > A[r]:
        arr2[index2] = A[i]
        index2 = index2 + 1 
    #other code

A 在此代码上方声明,其中元素的数量根据程序的输入文件而有所不同。目前,我正在获取索引超出范围错误并将 A[i] 分配给 arr1[index1]。有任何想法吗?我似乎无法在 Python 中使用它。

谢谢!

4

2 回答 2

9

您可以使用+or+=运算符来做到这一点:

>>> lis = []
>>> lis = lis + [1]
>>> lis
[1]
>>> lis = lis + [2]
>>> lis
[1, 2]
>>> lis += [3]  # += acts like list.extend, i.e changes the list in-place
>>> lis
[1, 2, 3]

您的代码的问题在于列表arr1arr2是空的,因此将值分配给尚不存在的索引将会 raise IndexError

for i in range(0, len(A)):
    if A[i] < A[r]:
        arr1 = arr1  + [A[i]]

    elif A[i] > A[r]:
        arr2 = arr2 + [A[i]]
于 2013-06-16T20:08:22.537 回答
3

看起来您正在尝试实现类似于快速排序的东西。python 中的列表实际上是不断增长的数组。新列表为空,因此您无法使用索引向其中插入值。使用append是这里的最佳选择,例如:

a = [1, 5, 3, 2, 6, 7]
al = []
ag = []
for x in a:
    if x < 4:
        al.append(x)
    else:
        ag.append(x)

现在al == [1, 3, 2]ag == [5, 6, 7]

如果您已经有一个现有列表,那么您可以使用索引来访问它的元素。我事先创建了列表的另一个示例:

a = [1, 5, 3, 2, 6, 7]
al = 3 * [0]
ag = 3 * [0]
index_l = 0
index_r = 0
for i in range(len(a)):
    if a[i] < 4:
        al[index_l] = a[i]
        index_l += 1
    else:
        ag[index_r] = a[i]
        index_r += 1

我不认为这是非常 Pythonic,你必须知道你的列表必须有多大。请不要使用这种方法。

此外,使用 不是一个好主意al += [a[i]],它的作用与追加相同,但是您正在创建中间列表,因此速度较慢:

>>> timeit.timeit('a += [1]', 'a = [1,2,3]')
0.14568603380625794
>>> timeit.timeit('a.append(1)', 'a = [1,2,3]')
0.07830060367457214

简单快速排序的示例:

def qsort(data):
    if len(data) <= 1:
       return data
    pivot = data[0]
    smaller = []
    greater = []
    for x in data[1:]:
        if x < pivot:
            smaller.append(x)
        else:
            greater.append(x)
    return qsort(smaller) + [pivot] + qsort(greater)
于 2013-06-16T20:47:42.367 回答