Как динамически создать трехмерный массив - PullRequest
2 голосов
/ 13 сентября 2011

Если я хочу массив, например:

[
    [
        [6,3,4],
        [5,2]
    ],
    [
        [8,5,7],
        [11,3]
    ]
]

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

Как это сделать?

Спасибо!

Ответы [ 3 ]

6 голосов
/ 13 сентября 2011

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

array_3d = {
    (0,0,0): 6, (0,0,1): 3, (0,0,2): 4,
    (0,1,0): 5, (0,1,1): 2,
    (1,0,0): 8, (1,0,1): 5, (1,0,2): 7,
    (1,1,0): 11,(1,1,1): 3 
}

Теперь вам не нужно беспокоиться о «предварительном выделении» любого размера или количества измерений или чего-либо еще.

1 голос
/ 13 сентября 2011

Я использую словари для всех случаев:

def set_3dict(dict3,x,y,z,val):
  """Set values in a 3d dictionary"""
  if dict3.get(x) == None:
    dict3[x] = {y: {z: val}}
  elif dict3[x].get(y) == None:
    dict3[x][y] = {z: val}
  else:
    dict3[x][y][z] = val

d={}    
set_3dict(d,0,0,0,6)
set_3dict(d,0,0,1,3) 
set_3dict(d,0,0,2,4)
...

В анологии у меня есть геттер

def get_3dict(dict3, x, y, z, preset=None):
  """Read values from 3d dictionary"""
  if dict3.get(x, preset) == preset:
    return preset
  elif dict3[x].get(y, preset) == preset:
    return preset
  elif dict3[x][y].get(z, preset) == preset:
    return preset
  else: return dict3[x][y].get(z)

>>> get3_dict(d,0,0,0)
 6
>>> d[0][0][0]
 6
>>> get3_dict(d,-1,-1,-1)
 None
>>> d[-1][-1][-1]
 KeyError: -1

На мой взгляд, преимущество заключается в том, что итерации по полю весьмапросто:

for x in d.keys():
  for y in d[x].keys():
    for z in d[x][y].keys():
      print d[x][y][z]
0 голосов
/ 13 сентября 2011

Хм, почти так, как вы думаете. В Python они называются списками, а не массивами, но у вас просто есть тройной вложенный список, например,

threeDList = [[[]]]

и затем вы используете три индекса для идентификации элементов, таких как

threeDList[0][0].append(1)
threeDList[0][0].append(2)
#threeDList == [[[1,2]]]
threeDList[0][0][1] = 3
#threeDList == [[[1,3]]]

Вам просто нужно быть осторожным, чтобы каждый используемый вами индекс ссылался на место в списке, который уже существует (т. Е. не существует в этом примере), и, если возможно, просто используйте понимания или циклы для манипулирования элементами списка.

Надеюсь, это поможет!

...