【问题标题】:Multi dimensional arrays in Python of a dynamic sizePython中动态大小的多维数组
【发布时间】:2012-08-13 19:21:47
【问题描述】:

对 python 非常陌生,所以我试图将我的头脑围绕在多维数组上。我阅读了现有的帖子,其中大多数都处理给定维度的多维数组。就我而言,我没有可能的总行数的维度。正在处理一个文件,它是 CSV,有 7 列,但每一行,取决于满足或不符合标准,因此被起草到一个数组中。基本上每行有 7 列,但无法预测行数。该行被视为列表。

我的目标是创建一个由符合条件的行组成的多维数组,然后能够访问数组中的值。我该怎么做?

基本上,我如何处理创建 2D 列表:

list_2d = [[foo for i in range(m)] for j in range(n)]

上面创建了一个 mxn 大小的列表,但就我而言,我只知道 n(列)而不知道 m(行)

【问题讨论】:

  • 嗯,..说我想创建二维列表,每个成员都可以通过指定列和行来访问,现在给定大小..我可以做 list_2d = [[foo for i in range(10)] for j in range(10)] 但我只知道我的二维数组中的总列数为 n,总行数是动态的,并且 coule ba nythng,我该如何处理?

标签: python multidimensional-array


【解决方案1】:

在列表中嵌套列表,您无需预先定义列表的长度即可使用它,您可以附加到它上面。想要另一个维度只需将另一个列表附加到最里面的列表。

[[[a1, a2, a3]  , [b1, b2, b3] , [c1, c2, c3]],
[[d1, d2, d3]  , [e1, e2, e3] , [f1, f2, f3]]]

要轻松使用它们,只需查看Nested List Comprehensions

【讨论】:

  • 这看起来像一个列表列表...您如何访问特定索引?
  • 说我只想获取值e2,那么我在看什么索引?
  • list[1][1][1] 供任何不愿点击概念证明的人使用。
  • @VornoiPotato 我点击了它....现在我正在尝试阅读如何在 python 中遍历二维数组...感谢您的帮助
  • 查找列表而不是数组,列表是您希望在这里使用的东西。数组完全是另一回事。 :)
【解决方案2】:

在 python 中,不需要在正手上声明列表大小。

读取文件行的​​示例如下:

file_name = "/path/to/file"
list = []

with open(file_name) as file:
  file.readline
  if criteria:
    list.append(line)

对于多维列表。在函数中创建内部列表并将其返回到附加行。像这样:

def returns_list(line):
  multi_dim_list = []
  #do stuff
  return multi_dim_list

将第一个代码中的最后一行替换为

list.append(returns_list(line))

【讨论】:

  • 这里有其他可用的方法docs.python.org/tutorial/datastructures.html
  • 我会小心不要在这里使用术语array(即使OP使用了)。术语数组具有误导性,因为有一个 array 模块,这是 numpy.ndarray 的通用名称,在谷歌搜索 python array 时更有可能出现。
  • 我已经换了,谢谢提醒。我每天使用 3-4 种语言,有时很难将它们分开。
【解决方案3】:

我发现这是为了创建一个简单的二维数组列表,它有 8 个元素宽并且在另一个维度上是动态的

list2d=[[] for i in xrange(8)]

然后你可以将任意数量的变量分配给 8 宽数组

list2d[0]=[1,2,3,4,5,6,7,8,9,10,11]
list2d[1]=[12,13,14,15,16,17,18,19]

等等……

【讨论】:

    【解决方案4】:

    下面试试

    #beg 
    
    a=[[]]
    
    r=int(input("how many rows "))
    c=int(input("how many cols "))
    
    for i in range(r-1):
        a.append([])
    
    for i in range(r):
        print("Enter elements for row ",i+1)
        for j in range(c):
            num=int(input("Enter element "))
            a[i].append(num)
    
    for i in range(len(a)):
         print()
         for j in range(len(a[i])):
             print(a[i][j],end="  ")
    

    结束

    【讨论】:

    • 由于问题表明行数是不可预测的,因此在您的上述代码中,我们无法获得 r 的值。更好地阅读此 EOF 文件并继续将行列表附加到列表的主列表 a
    【解决方案5】:

    你甚至可以试试这个对我有用

    s = [[] for y in range(n)]

    【讨论】:

      【解决方案6】:

      如果您保证有 'n' 列,那么您可以在内存中转置。

      from collections import defaultdict
      import csv
      
      cols = defaultdict(list)
      
      with open('somefile.csv') as csvin:
          for row in csv.reader(csvin):
              for colno, col in enumerate(row):
                  cols[colno].append(col)
      

      仍然不能 100% 确定这是您的问题...

      【讨论】:

        猜你喜欢
        • 2019-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-12
        • 1970-01-01
        • 2011-01-28
        • 1970-01-01
        相关资源
        最近更新 更多