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

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 に答える