【问题标题】:How to dynamically create a three-dimensional array如何动态创建一个三维数组
【发布时间】:2011-09-13 02:32:10
【问题描述】:

如果我想要一个数组,例如:

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

我只是给你一个简单的例子。实际上,每个维度的数组的数量会随着不同的条件而改变。而且我不想使用列表的乘法。我想直接创建每个元素。

怎么做?

谢谢!

【问题讨论】:

  • 这与daniweb.com/software-development/python/threads/70434 提出的问题相同。可以在那里找到更多信息。
  • 您使用的是lists,而不是数组。
  • 我不明白你的问题。
  • 你能写出条件吗?因为我假设确定它们的逻辑是推动构建阵列的原因 - 如果没有这些信息,很难回答。
  • 查看标记为multi-dimensional-array and python 的问题。那里有一些有用的东西。 (例如,建议使用 numpy。)

标签: python arrays multidimensional-array


【解决方案1】:

使用从多维索引到值的映射。不要使用列表列表的列表。

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 
}

现在您不必担心“预分配”任何大小或数量的维度或任何东西。

【讨论】:

  • 您可以通过array_3d[1, 0, 2]访问它。
【解决方案2】:

对于这种情况,我会一直使用字典:

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)
...

在anology我有一个吸气剂

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]

【讨论】:

    【解决方案3】:

    嗯,和你想的差不多。在 Python 中,它们被称为列表,而不是数组,但您只有一个三重嵌套列表,例如,

    threeDList = [[[]]]
    

    然后你使用三个索引来识别元素,比如

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

    您只需要注意您使用的每个索引都指向列表中已经存在的位置(即threeDList[0][0][2]或threeDList[0][1]或threeDList[1]确实此示例中不存在),并且在可能的情况下,只需使用推导式或 for 循环来操作列表的元素。

    希望这会有所帮助!

    【讨论】:

    • -1:他知道这种做法,但不符合他的限制; “其实每个维度的数组个数会随着条件的不同而变化。”
    • 是的,这就是为什么我告诉他如何“直接操作每个元素”。
    • 他的意思是它不是一个三维数组,只要它没有强制约束。你可以让threeDList[0][0] 包含五个元素,threeDList[0][1] 包含十七个元素,threeDList[4] 不包含任何元素;它不是三次数组的定义。
    • 至少,我认为这就是他的意思……我读得越多,我就越感到困惑。
    • 是的。由于我可能解释得不够清楚,Python 列表的可变性(它们不像 C 或 Java 数组)使得这很容易做到。
    猜你喜欢
    • 2020-07-25
    • 2016-02-28
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 2012-03-16
    • 2012-04-11
    • 1970-01-01
    • 2022-11-18
    相关资源
    最近更新 更多