我是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中使用它。
谢谢!
答案 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]
您的代码存在的问题是列表arr1
和arr2
是空的,所以
为尚不存在的索引分配值将会引发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)