2012-02-20 9 views
3

私はロボットを8x8の2dグリッドルームの周りに動かすように取り組んでいます。そして、1パートはロボットの周りに最も近い5タイルからなるセンサーを初期化しています。ここPythonのリストインデックスはタプルではなく整数でなければなりませんエラー

self.sensors = [0 for x in xrange(5)] 

私は5つの要素の配列の空を作成してい

が、私はこのようなセンサの値を設定しようとすると:。

if self.heading == 'East': 
     self.sensors[0] = self.room[self.x, self.y-1] 
     self.sensors[1] = self.room[self.x+1, self.y-1] 
     self.sensors[2] = self.room[self.x+1, self.y] 
     self.sensors[3] = self.room[self.x+1, self.y+1] 
     self.sensors[4] = self.room[self.x, self.y+1] 

を私はエラーを取得します'リストのインデックスは必須です整数であり、タプルではありません。

+2

:で

より多くの例。どのように部屋を定義したかを教えてください。 – Cameron

答えて

7

self.roomは「2dグリッド」と言います。リストのリストだと思います。このケースでは、

self.room[self.x][self.y-1] 

代わりに、一対self.x, self.y-1と外側のリストをインデックスとしてその要素にアクセスする必要があります。

+0

ああ、本当に明白なようです、ありがとう! – Liban

-2

リストのインデックスは整数でなくてはならないからです。あなたの場合は、タプルを使用しようとしています。

タプルインデックスを持つself.roomを作成したことがないため、コードは特に奇妙です。

2

self.room[self.x, self.y-1]インデックスself.roomとタプル。不揃いの配列の場合は、代わりにself.room[self.x][self.y-1]を使用する必要があります。

5

self.roomから問題が発生しています。このBeacuse

self.room[self.x, self.y-1] 

は同じです:

self.room[(self.x, self.y-1)] 

そして、それはあなたのtupleエラーです。

二つの可能性があります。

self.room[self.x][self.y-1] 
  • あなたがself.roomをスライスしたい:

    self.room[self.x:self.y-1] 
    
    • self.roomあなたは、おそらくのようなものを意味することを意味し2次元配列であり、

    self.roomについてさらにご提供ください。

    +0

    部屋は実際に2次元配列ですが、私は間違った構文を使用しました。ありがとうございました。 :) – Liban

    +1

    ありがとう - の代わりに使用されて:私はあなたの答えを読むまで見つからなかった:) –

    0

    どのような自己のタイプです。部屋、私は部屋は、あなたがこの

    if self.heading == 'East': 
        self.sensors[0] = [self.x, self.y-1] 
    

    またはこの

    if self.heading == 'East': 
        self.room = [self.x, self.y-1] 
        self.sensors[0] = self.room 
    

    >>> a = [] 
    >>> type(a) 
    <type 'list'> 
    
    >>> a[2,3] 
    Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
    TypeError: list indices must be integers 
    
    >>> a = [2,3] 
    

    このような
    0

    なぜそれがそのエラーを与えないなどのように割り当てる必要があり、この場合のリストだと思います?私はタプルを渡していません!

    class C(object): 
        def __getitem__(self, k): 
         return k 
    
    # Single argument is passed directly. 
    assert C()[0] == 0 
    
    # Multiple indices generate a tuple. 
    assert C()[0, 1] == (0, 1) 
    

    とリストは、そのような引数に対処するために作られていません。

    []解像度を扱う__getitem__、ので、タプルにself.room[1, 2]を変換します。エラーが原因であなたが部屋ではなく、センサーをインデックスしている方法であるhttps://stackoverflow.com/a/33086813/895245

    関連する問題