web-dev-qa-db-ja.com

forループを使用した配列への値の割り当てPython

文字列の値を別の配列インデックスに割り当てようとしています

「リストの割り当てが範囲外です」というエラーが表示されます

uuidVal = ""
distVal = ""
uuidArray = []
distArray = []

for i in range(len(returnedList)):
     for beacon in returnedList:
            uuidVal= uuidVal+beacon[:+2]
            uuidArray[i]= uuidVal
            distVal= distVal+beacon[-2:]
            distArray[i]= distVal
            uuidVal=""
            disVal=""

使ってみた

distArray[i].append(distVal)

の代わりに

distArray[i]= distVal

しかし、「リストインデックスが範囲外です」というエラーが発生しました。

使用する

distArray.append(distVal)

エラーなしで機能しましたが、結果は間違っていました

新しい割り当てられた値を次のインデックスの古い値と連結し続けるため

動作方法:

returnedList ['52:33:42:40:94:10:19、-60''22:34:42:24:89:70:89、-90''87:77:98:54:81:23:71、-81']

反復ごとに、最初の文字をidVal(例:52、22、87)に割り当て、最後の2つの文字をdistVal(例:60、90、81)に割り当てます

最後にidArrayにはこれらの値が必要[52、22、87]

およびdistArrayにはこれらの値が必要です[60、90、81]

注:使用。appendたとえば、distArrayと一緒に使用した場合distArray.append(distVal)値は次のようになります[60、6090、609081]

4
AMS91

はい、あなたは範囲外のエラーリストインデックスを取得します:

distArray[i] = distVal

まだ作成されていないインデックスにアクセスしている

このデモを見てみましょう:

>>> a=[]   # my list is empty 
>>> a[2]    # i am trying to access the value at index 2, its actually not present
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range

コードは次のようになります。

uuidArray = []
distArray = []
distVal = ""
for beacon in returnedList:
        uuidArray.append(beacon[:2])
        distval += beacon[-2:]
        distArray.append(distVal)

出力はuudiArray:['52'、 '22'、 '87']とdistArray:['60'、 '6090'、 '609081']になります

6
Hackaholic

DistArrayを次のように定義した場合:distArray = []

要素が0のリストを初期化しているので、distArray[2]は、配列の全長を超える要素にアクセスしようとしているため、正しくエラーをスローします。

これに対処するには2つの方法があります。

  1. appendを使用します。これはリストを受け取り、関数呼び出しに含まれる要素によってそれを拡張します。これは、非常にまれなケースであるimo以外のすべての場合に推奨されます。
  2. 空のリストを明示的に定義します。これは次のようにして行うことができます:distArray = [0]*num_elements、 どこ num_elementsは、必要な要素の数です。これはサイズのリストを作成しますnum_elementsすべて0です。
1
dave

他の人はすでに間違いを説明しているので、この問題を解決する方法については2cに任せます。まず、純粋なPythonを使用できます。

distArray = [None for _ in xrange(max_value+1)]

None型のオブジェクトを使用して配列を割り当てています(多くの人はゼロを好んでいます)。整数やブール値として解釈できないためです。

プロセスがRAMを集中的に使用する場合は、numpy配列を使用することをお勧めします。そして、numpyに空の配列を作成する非常に効率的な方法があります。

import numpy as np

distArray = np.empty(max_value+1, dtype=str)

データ型を手動で選択する必要があることに注意してください。

あなたが達成しようとしているのは、基本的には単純化されたハッシュマップ/テーブルです。最大値がわからない場合は、エラーを発生させるのではなく、境界外で呼び出された場合にサイズが大きくなる独自の「動的」配列を作成することを検討できます。

class DistArray():
    def __init__(self, starting_size):
        self.arr = [None for _ in xrange(starting_size)]

    def __getitem__(self, i):
        return self.arr[i]

    def __iter__(self):
        return iter(self.arr)

    def insert_item(self, item, value):
            try:
                self.arr[value] = item
            except:
                self.arr.extend([None for _ in xrange(value - len(self.arr))])
                self.arr[value] = item

これはあなたのニーズに適応します。

distArray = DistArray(starting_size)
distArray.insert_item(string, value)
1
Eli Korvigo
def array():
    a = []
    size = int(input("Enter the size of array: "))

    for i in range(size):
        b = int(input("enter array element: "))
        a.append(b)
    return a
0
Tanuja Shelke