【问题标题】:how to create a multidimensional array on the fly using python?如何使用python动态创建多维数组?
【发布时间】:2020-07-21 17:11:04
【问题描述】:

我有一个循环,每次运行时都会生成一个 value_list,在每次迭代结束时,我想将所有列表附加到一个多维数组中

我有:

  • value_list = [1,2,3,4] 在第一次迭代中
  • value_list = [5,6,7,8] 在第二次迭代中
  • value list = [9,10,11,12] 在第三次迭代中
  • 等等...

在每次迭代结束时,我想要一个多维数组,例如

  • value_list_copy = [[1,2,3,4]] 在第一次迭代中
  • value_list_copy = [[1,2,3,4],[5,6,7,8]] 在第二次迭代中
  • value_list_copy = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
  • 等等...

我怎样才能做到这一点?

谢谢

【问题讨论】:

  • 我回滚了您的编辑,因为在编辑之后问题完全变成了一个新问题。如果您必须尊重用户回答您发布的问题所花费的时间。突然之间,您不能只编辑并提出新问题。你总是可以问另一个问题。提出新问题click here
  • 对不起...我是新手...会发布一个不同的问题
  • 别...顺便说一句,欢迎来到Stack Overflow。我只是想告诉这里的事情是如何运作的。 ;)
  • @PriyaRamakrishnan 您可以将任何答案标记为您的解决方案,以感谢人们花时间回答您的问题(这也会给您一些额外的声誉)。干杯,欢迎来到世界上最好的社区~!

标签: python arrays list multidimensional-array


【解决方案1】:

在下面试试这个:

value_list_copy = []

for i in range(n): # ----------> Assuming n is the number of times your loop is running
    value_list_copy.append(value_list)  # ------ Append your value list in value_list_copy in every iteration

在这里你会得到一个数组。

print(value_list_copy)

【讨论】:

    【解决方案2】:

    你可以使用嵌套推导和itertools.count:

    from itertools import count, islice
    
    cols = 4
    rows = 5
    
    c = count(1)
    matrix = [[next(c) for _ in range(cols)] for _ in range(rows)]
    # [[1, 2, 3, 4], 
    #  [5, 6, 7, 8], 
    #  [9, 10, 11, 12], 
    #  [13, 14, 15, 16], 
    #  [17, 18, 19, 20]]
    

    酷孩子们可能还想zip 自带计数迭代器:

    list(islice(zip(*[c]*cols), rows))
    # [(1, 2, 3, 4), 
    #  (5, 6, 7, 8), 
    #  (9, 10, 11, 12), 
    #  (13, 14, 15, 16), 
    #  (17, 18, 19, 20)]
    

    【讨论】:

      【解决方案3】:

      这里有另外两个可能的解决方案:

      双循环方法

      rows, cols, start = 3, 4, 1
      
      value_list_copy = []
      for j in range(rows):
          value_list = []
          for i in range(start, cols + start):
              value_list.append((j*cols)+i)
          value_list_copy.append(value_list)
          print(
              f'value_list = {value_list}\n'
              f'value_list_copy = {value_list_copy}\n'
          )
      
      

      列表比较方法

      rows, cols, start = 3, 4, 1
      
      value_list_copy_2 = [
          [
              (j*cols)+i for i in range(start, cols + start)
          ] for j in range(rows)
      ]
      print(f'value_list_copy_2 = {value_list_copy_2}')
      

      Python Tutor Link to example code

      【讨论】:

        【解决方案4】:

        试试这个:

        limit = 10
        length_of_elements_in_each_list = 4
        [range(i, i+length_of_elements_in_each_list) for i in range(1, limit)]
        

        您可以根据需要设置limit和length_of_elements_in_each_list。

        【讨论】:

        • 这会创建 listrange 对象而不是 listlist 对象。即使您使用[list(range(i, i+length_of_elements_in_each_list)) for i in range(1, limit)] 使其成为list 对象中的list,嵌套列表也与问题中描述的模式不匹配。
        • @Phillyclause89 我忘了添加 [/*]。我们可以通过将最后一行更改为:print([[*range(i, i+length_of_elements_in_each_list)] for i in range(1, limit)]) 来获得所需的结果
        【解决方案5】:

        如果您使用的是Python3.8,请使用Walrus assignment(:=)。

        对于Syntax and semantic

        count=0
        rows=5
        cols=4
        [[(count:=count+1) for _ in range(cols)] for _ in range(rows)]
        

        输出:

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

        不使用:=

        rows=5
        cols=4
        [list(range(i,i+cols)) for i in range(1,rows*cols,cols)]
        

        【讨论】:

        • 海象岩石!我已经忘记了。谢谢
        • @Jean-FrancoisT。 IMO python3.8中最突出的新特性
        猜你喜欢
        • 2011-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-18
        • 1970-01-01
        • 2022-01-02
        相关资源
        最近更新 更多