Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to insert elements into array without using append, Python?

I'm a beginner with Python and am having a bit of trouble inserting elements into an array without using the append() function.

This is part of my code which I hope illustrates enough but feel free to ask for more details if it helps:

#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 is declared above this code and the number of elements in it vary based on an input file for the program. Currently I'm getting the index out of range error and on the assignment of A[i] to arr1[index1]. Any ideas? I just can't seem to get this working in Python.

Thanks!

like image 383
Tudor Hofnar Avatar asked Jun 16 '13 20:06

Tudor Hofnar


2 Answers

You can do that using + or += operators:

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

The problem with your code is that the lists arr1 and arr2 are empty, so assigning values to indexes which don't exist yet is going to 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]]
like image 95
Ashwini Chaudhary Avatar answered Nov 14 '22 23:11

Ashwini Chaudhary


It looks like you are trying to implement something similar to quicksort. Lists in python are in reality growing arrays. New list is empty, so you can't insert a value into it by using an index. Using append is the best option here, e.g.:

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

Now al == [1, 3, 2] and ag == [5, 6, 7].

If you already have an existing list, then you can access its elements by using an index. Another example where I have created the lists beforehand:

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

I don't think this is very pythonic, and you have to know how large you lists must be. Please don't use this approach.

Also, it's not a good idea to use al += [a[i]], it's doing the same as append, but you are creating intermediate lists, so it's slower:

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

Example of a simple quicksort:

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)
like image 38
David Marek Avatar answered Nov 14 '22 22:11

David Marek