【问题标题】:Parameterizing the construction of a Python list参数化 Python 列表的构造
【发布时间】:2020-12-16 01:09:04
【问题描述】:

通过使用此 Python 代码(我正在使用 Python 3.6):

length = 4
overall = [["row" + str(length + 1)] +
           [1.0] + [0.0] * (length - 1)]

for i in range(1, length):
   overall  += [["row" + str(i + length + 1)] +
                [0.0] * i + [1.0] + [0.0] * (length - (i + 1))]

我获得了以下列表:

输出 1:

overall = [['row5', 1.0, 0.0, 0.0, 0.0],
           ['row6', 0.0, 1.0, 0.0, 0.0],
           ['row7', 0.0, 0.0, 1.0, 0.0],
           ['row8', 0.0, 0.0, 0.0, 1.0]]

现在,我想对上面的代码进行参数化。

给定一个参数,例如n_repetitions = 3,我想获取:

输出 2:

overall = [['row5', 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0],
           ['row6', 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0],
           ['row7', 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0],
           ['row8', 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]]

其中,在每个“行”中,由 4 个单元素数字列表组成的初始“组”已重复 n_repetitions 次(在此示例中为 3)。

哪种方式是自动执行此操作的好方法(例如:使用 for 循环、列表推导式……)?

【问题讨论】:

    标签: python python-3.x list for-loop


    【解决方案1】:

    是的,您可以像这样使用列表理解 + 列表加法/乘法:

    overall = [['row5', 1.0, 0.0, 0.0, 0.0],
               ['row6', 0.0, 1.0, 0.0, 0.0],
               ['row7', 0.0, 0.0, 1.0, 0.0],
               ['row8', 0.0, 0.0, 0.0, 1.0]]
    
    overall = [[row[0]] + row[1:]*repeat for row in overall]
    

    【讨论】:

      【解决方案2】:

      我想确认一下。

      我遵循你的代码

      输出:

      overall = [['row5', 1.0, 0.0, 0.0, 0.0], 
                 ['row6', 0.0, 1.0, 0.0, 0.0], 
                 ['row7', 0.0, 0.0, 1.0, 0.0], 
                 ['row8', 0.0, 0.0, 0.0, 1.0]]
      

      你希望什么?

      overall = [["row5"], [1], [0], [0], [0],
                 ["row6"], [0], [1], [0], [0],
                 ["row7"], [0], [0], [1], [0],
                 ["row8"], [0], [0], [0], [1]]
      

      这个?

      length = 4
      n_repetitions = 3
      arr = [1.0] + [0.0] * (length - 1)
      overall = [["row" + str(length + 1)] + arr * n_repetitions]
      
      for i in range(1, length):
          _ = [0.0] * i + [1.0] + [0.0] * (length - (i + 1))
          overall += [["row" + str(i + length + 1)] + _ * n_repetitions]
      

      【讨论】:

        【解决方案3】:

        总体是列表的列表

            type(overall)
            list
        

        在矩阵方面,这是您没有第一列的 ID 矩阵:

            id =[l[1:] for l in overall]
        

        这是你的标签列:

            labels = [[l[0]]  for l in overall]
        

        然后您可以隔离每个列表的第一个元素并重复其余部分:

            n_repetitions = 3
            result = [[l[0]] + l[1:]*n_repetitions for l in overall]
            result
        
        [['row5', 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0],
         ['row6', 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0],
         ['row7', 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0],
         ['row8', 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-09-23
          • 2014-02-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-13
          • 1970-01-01
          • 2020-01-23
          相关资源
          最近更新 更多