【问题标题】:How to assign a column in 2d-array to some repetitive range using Python?如何使用 Python 将二维数组中的列分配给某个重复范围?
【发布时间】:2016-10-24 07:07:26
【问题描述】:

我想将二维数组的列值分配给重复范围。
例如,范围将从 1 到 3:

[1, 0, 0]
[2, 0, 0]
[3, 0, 0]
[1, 0, 0]
[2, 0, 0]
[3, 0, 0]

我有代码:

width, height = 3, 6 
array2d = [[0 for x in range(width)] for y in range(height)]

repRange = list(range(1,4)) #it is [1, 2, 3]

j = 0
for i in range(height):    
    array2d[i][0] = repRange[j]

    if j >= len(repRange)-1:
        j = 0
    j += 1

for row in array2d:
    print(row)

输出:

[1, 0, 0]
[2, 0, 0]
[3, 0, 0]
[2, 0, 0]
[3, 0, 0]
[2, 0, 0]

失败了。开始很好,但在第二次重复中失败了。


逻辑有什么问题?如果有更简单的方法,希望大家分享。

【问题讨论】:

    标签: python arrays python-3.x multidimensional-array repeat


    【解决方案1】:

    看看标准库模块itertools。函数cycle 做你想做的事:

    from itertools import cycle
    width, height = 3, 6 
    array2d = [[0 for x in range(width)] for y in range(height)]
    for l, i in zip(array2d, cycle([1,2,3])):
        l[0] = i
    

    【讨论】:

      【解决方案2】:

      您的逻辑问题在于,当您到达repRange 的末尾时,您将j 设置为1 而不是0。这是因为j += 1 在if 语句之后; if 语句中的测试也需要调整。这是您的代码的修复版本。

      width, height = 3, 6 
      array2d = [[0 for x in range(width)] for y in range(height)]
      
      repRange = list(range(1, 4)) #it is [1, 2, 3]
      
      j = 0
      for i in range(height):
          array2d[i][0] = repRange[j]
      
          j += 1
          if j >= len(repRange):
              j = 0
      
      for row in array2d:
          print(row)
      

      输出

      [1, 0, 0]
      [2, 0, 0]
      [3, 0, 0]
      [1, 0, 0]
      [2, 0, 0]
      [3, 0, 0]
      

      这是一个更紧凑的版本。

      from itertools import cycle
      
      width, height = 3, 6 
      repRange = cycle(range(1, 4))
      zeroes = [0] * (width - 1)
      array2d = [[next(repRange)] + zeroes for y in range(height)]
      
      for row in array2d:
          print(row)
      

      还有一个:

      from itertools import cycle
      
      width, height = 3, 6 
      zeroes = [0] * (width - 1)
      array2d = [[v] + zeroes for _, v in zip(range(height), cycle(range(1, 4)))]
      
      for row in array2d:
          print(row)
      

      【讨论】:

        猜你喜欢
        • 2019-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-20
        • 1970-01-01
        相关资源
        最近更新 更多