【问题标题】:How to insert elements into array without using append, Python?如何在不使用追加的情况下将元素插入数组,Python?
【发布时间】:2013-06-16 20:04:06
【问题描述】:

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

谢谢!

【问题讨论】:

  • r 应该是什么?
  • 不使用.append的原因是什么?
  • r 是我输入数组的最后一个元素。不好意思,忘了说,和len(A)的值基本一样
  • len(A) 是列表的长度。最后一个元素在索引len(A) - 1处,也可以使用负数,则为A[-1]

标签: python arrays list


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我现在就试试这个
  • 非常感谢!这行得通,我用 + 而不是 +=,其中任何一个比另一个更有效,或者在这种情况下使用更好?
  • @TudorHofnar += 就地更改列表,另一方面 + 每次都会创建一个新列表。更喜欢+= 而不是+。相关帖子:stackoverflow.com/questions/15376509/…
【解决方案2】:

您似乎正在尝试实现类似于快速排序的功能。 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)

【讨论】:

  • 是的,我正在实现快速排序,但我不能使用 append 或任何内置函数,所以这就是为什么我正在寻找一个替代方案,如 +=,不幸的是:(。顺便说一句,谢谢回复,帮助我更好地理解事情:)
  • 好吧,你不能使用任何内置函数到底是什么意思? += 也是一个内置函数,有点。也许您应该实施就地版本? en.wikipedia.org/wiki/Quicksort#In-place_version
  • @DavidMarek 您的解决方案正在使用 append 方法,但 Tudor 要求没有它的解决方案。
猜你喜欢
  • 2021-12-24
  • 2016-07-06
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2020-01-23
相关资源
最近更新 更多