【问题标题】:Split a 2D list into square blocks with equally distributed elements将二维列表拆分为具有均匀分布元素的方块
【发布时间】:2018-10-06 18:47:50
【问题描述】:

假设我有一个列表

ls = [[1,2,3], 
      [4,5,6], 
      [7,8,9]]

现在我想将此列表拆分为其他较小的正方形 2d 列表,其中正方形的边由输入 k 确定。因此,如果 k 为 2,我将获得 4 个新列表,试图在它们之间平均分配元素,这些列表将是:

L1 = [1,2,
      4,5]

L2 = [3,
      6]

L3 = [7,8]

L4 = [9]

我不太确定我该怎么做。如果我决定方格的数量,我可以拆分列表,但如果方格的数量是用户输入的随机数,则不能。我试过这个,但在决定第一个元素块之后,我不确定如何从这一点继续。

ls = [[1,2,3], 
      [4,5,6], 
      [7,8,9]]

def splitList(ls, k):
  if len(ls) == 1:
    return ls[0]
  else:
    for x in range(k):
      for y in range(k):
        print (ls[x][y])


print (splitList(ls, 2))

任何帮助将不胜感激。 感谢您的宝贵时间!

【问题讨论】:

  • 数组和列表在 Python 中是不可互换的术语。如果您不知道区别,那么您正在使用列表。此外,您的列表不是“平均分布的”

标签: python arrays list split


【解决方案1】:

实现此目的的一种简单方法是使用numpy arrays 而不是“二维列表”(您可以轻松地将一个列表转换为另一个)并使用basic slicing

import numpy as np

ls = np.array([[1,2,3], 
               [4,5,6], 
               [7,8,9]])

nr = ls.shape[0]  # number of rows
nc = ls.shape[1]  # number of columns

然后切片

L1 = ls[:k, :k]
L2 = ls[:k, k:nc]
L3 = ls[k:nr, :k]
L4 = ls[k:nr, k:nc]

【讨论】:

    【解决方案2】:

    如果您要拆分一个 2D 列表列表,则不应使用 Numpy np.array,那不是列表...

    让我们定义另一种打印列表列表的方法

    In [79]: def pmat(mat):
        ...:     for row in mat:
        ...:         print(''.join('%5d'%x for x in row))
    

    数值参数

    In [80]: nr, nc, k = 6, 8, 4
    

    生成一个 LoL 并通过打印检查它

    In [81]: a = [[1+c+r*nc for c in range(nc)] for r in range(nr)]
    In [82]: pmat(a)
        1    2    3    4    5    6    7    8
        9   10   11   12   13   14   15   16
       17   18   19   20   21   22   23   24
       25   26   27   28   29   30   31   32
       33   34   35   36   37   38   39   40
       41   42   43   44   45   46   47   48
    

    我们没有智能索引,所以我们必须使用常规索引(即双括号)和列表理解

    In [83]: a11 = [a[r][:k] for r in range(k)]    ; a12 = [a[r][k:] for r in range(k)]
    In [84]: a21 = [a[r][:k] for r in range(k,nr)] ; a22 = [a[r][k:] for r in range(k,nr)]
    

    最后我们检查一下我们的结果。

    In [85]: pmat(a11)
        1    2    3    4
        9   10   11   12
       17   18   19   20
       25   26   27   28
    
    In [86]: pmat(a12)
        5    6    7    8
       13   14   15   16
       21   22   23   24
       29   30   31   32
    
    In [87]: pmat(a21)
       33   34   35   36
       41   42   43   44
    
    In [88]: pmat(a22)
       37   38   39   40
       45   46   47   48
    

    【讨论】:

      猜你喜欢
      • 2019-02-21
      • 1970-01-01
      • 1970-01-01
      • 2017-01-09
      • 2016-03-20
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 2011-05-05
      相关资源
      最近更新 更多