Как создать 2D-массив в Python - PullRequest
3 голосов
/ 29 февраля 2012

Я пытаюсь создать индексированный 2D-массив в Python, но продолжаю сталкиваться с ошибками, так или иначе.

Следующий код:

#Declare Constants (no real constants in Python)
PLAYER = 0
ENEMY = 1
X = 0
Y = 1
AMMO = 2
CURRENT_STATE = 3
LAST_STATE = 4

#Initilise as list
information_state = [[]]
#Create 2D list structure
information_state.append([PLAYER,ENEMY])
information_state[PLAYER].append ([0,0,0,0,0])#X,Y,AMMO,CURRENT_STATE,LAST_STATE
information_state[ENEMY].append([0,0,0,0,0])#X,Y,AMMO,CURRENT_STATE,LAST_STATE


for index, item in enumerate(information_state):
        print index, item

information_state[PLAYER][AMMO] = 5

Создает этот вывод:

0 [[0, 0, 0, 0, 0]]
1 [0, 1, [0, 0, 0, 0, 0]]
IndexError: list assignment index out of range

Я привык использовать массивы PHP, например:

$array['player']['ammo'] = 5;

Есть ли что-нибудь подобное в Python? Я слышал, как люди рекомендуют NumPy, но я не мог понять это: (

Я новичок в этом Python.

Примечание. Использование Python 2.7

Ответы [ 3 ]

3 голосов
/ 29 февраля 2012

Я думаю, вам стоит взглянуть на учебник по структурам данных Python , и то, что вы ищете, называется здесь словарём, представляющим собой список пар ключ-значение.

в вашем случае вы можете использовать вложенный словарь в качестве значения для ключа, чтобы вы могли вызвать

## just examples for you ##

player_dict_info = {'x':0, 'y':0, 'ammo':0}
enemy_dict_info = {'x':0, 'y':0, 'ammo':0}
information_state = {'player': player_dict_info, 'enemy': enemy_dict_info}

и получить доступ к каждому элементу, как вы сделали в php

1 голос
/ 29 февраля 2012

Вы хотите dict (в виде ассоциативного массива / карты), который в python определен с {}.[] - это тип данных list Python.

state = {
    "PLAYER": {
        "x": 0, 
        "y": 0, 
        "ammo": 0, 
        "state": 0, 
        "last": 0
    }, 
    "ENEMY": {
        "x": 0, 
        "y": 0, 
        "ammo": 0, 
        "state": 0, 
        "last": 0
    }
}
0 голосов
/ 29 февраля 2012

Вы можете иметь список списков, например:

In [1]: [[None]*3 for n in range(3)]
Out[1]: [[None, None, None], [None, None, None], [None, None, None]]

In [2]: lol = [[None]*3 for n in range(3)]

In [3]: lol[1][2]

In [4]: lol[1][2] == None
Out[4]: True

НО все списки Python индексируются целым числом.Если вы хотите индексировать по строке, вам понадобится dict.

. В этом случае вам может потребоваться defaultdict:

In [5]: from collections import defaultdict

In [6]: d = defaultdict(defaultdict)

In [7]: d['foo']['bar'] = 5

In [8]: d
Out[8]: defaultdict(<type 'collections.defaultdict'>, {'foo': defaultdict(None, {'bar': 5})})

In [9]: d['foo']['bar']
Out[9]: 5

Это означает, что если вы хранитеидентичные наборы полей, может быть лучше создать класс, создать из него экземпляры объектов, а затем просто сохранить объекты.

...