如何在不使用append,Python的情况下将元素插入到数组中?

时间:2013-06-16 20:04:07

标签: python arrays list

我是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中使用它。

谢谢!

2 个答案:

答案 0 :(得分:7)

您可以使用++=运营商执行此操作:

>>> 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是空的,所以 为尚不存在的索引分配值将会引发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]]

答案 1 :(得分:1)

看起来你正在尝试实现类似于quicksort的东西。 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]]并不是一个好主意,它与append一样,但是你正在创建中间列表,所以它更慢:

>>> 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)