【问题标题】:Python How to Get All Rectangular Subsets of a 2D listPython如何获取二维列表的所有矩形子集
【发布时间】:2021-12-31 13:02:15
【问题描述】:

假设给了我一个二维列表

001
111
111

我想获取二维列表的所有可能子集,这些子集是矩形并包含左上角元素/grid[0][0] 处的元素(我不知道如何描述它)

它应该输出:

0

00

001

0
1

00
11

001
111

0
1
1

00
11
11

001
111
111

如何获得所有可能的子集?我对如何实现它没有最模糊的想法。

【问题讨论】:

  • 您想对二维列表中的每一行都执行此操作吗?
  • @YasharAhmadov 我不确定你的意思。你能详细说明一下吗?我想获取包含数组左上角项目的整个数组的所有矩形子集
  • 好的..例如,'011' 是否也适合您?
  • @YasharAhmadov 是的,如果你指的是数组的第一列

标签: python matrix multidimensional-array subset rectangles


【解决方案1】:

根据您的解释,我想出了以下解决方案:

import numpy as np

list1=[[0,0,1],[1,1,1],[1,1,1]]

df=pd.DataFrame(list1, columns=['a','b','c'])

list2=[]



for i in range(1,4):
    for j in range(1,4):
        list2.append(df.iloc[:i,:j].to_numpy('int').tolist())

输出:

[[[0]], 
 [[0, 0]],
 [[0, 0, 1]],
 [[0], [1]],
 [[0, 0], [1, 1]],
 [[0, 0, 1], [1, 1, 1]],
 [[0], [1], [1]],
 [[0, 0], [1, 1], [1, 1]],
 [[0, 0, 1], [1, 1, 1], [1, 1, 1]]]

如果您希望有更高阶矩阵,那么您只需将 4 更改为您希望在 for i/j in range(2,4) 中的数字。

【讨论】:

  • 所有组合都包含[0][0]处的元素,请仔细查看输出。这是一个 2D 列表....看看 2 个方括号内的元素...
  • 对不起,我看错了程序和数据框。这是一个不错的解决方案,但是没有numpy 有没有办法做到这一点?
  • 谢谢!我调整了一个不必使用numpy 的解决方案,尽管我的实现的时间复杂度不是那么好。
  • 很高兴听到这个消息!很高兴我的回答很有用
【解决方案2】:

一个简单的方法是:

for i in range(n):
    for j in range(n):
        x = grid[0:i+1]
        for k in x:
            print(k[0:j+1])
        print()

【讨论】:

    【解决方案3】:
    from itertools import product
    
    ints = [
        [0, 0, 1],
        [1, 1, 1],
        [1, 1, 1]
    ]
    
    def get_slice(ints, x, y):
        rows = ints[0:y+1]
        return list(map(lambda row: row[0:x+1], rows))
    
    x_max = len(ints[0]) # Assuming all rows have the same length
    y_max = len(ints)
    
    for coord in product(range(x_max), range(y_max)):
        for row in get_slice(ints, *coord):
            print(*row)
        print()
    

    输出:

    0
    
    0
    1
    
    0
    1
    1
    
    0 0
    
    0 0
    1 1
    
    0 0
    1 1
    1 1
    
    0 0 1
    
    0 0 1
    1 1 1
    
    0 0 1
    1 1 1
    1 1 1
    

    get_slice 首先根据参数y 对ints 进行切片,这只会产生我们感兴趣的“行”。然后我们根据参数x 对每一行进行切片。

    我们使用itertools.product 生成所有可能的xy 坐标,并将其用作get_slice 的参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多