Python 如何获取二维列表的所有矩形子集
Python How to Get All Rectangular Subsets of a 2D list
假设我有一个二维列表
001
111
111
而且我想获取二维列表的所有可能子集,这些子集是矩形的并且包含 grid[0][0]
处的左上角 element/the 元素(我不知道如何描述它)
它应该输出:
0
00
001
0
1
00
11
001
111
0
1
1
00
11
11
001
111
111
你如何获得所有可能的子集?我对如何实现它一无所知。
根据您的解释,我想出了以下解决方案:
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]]]
如果你想要更高阶的矩阵,那么你只需要将for i/j in range(2,4)
中的4变成你想要的数字即可。
一个简单的方法是:
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()
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
进行切片,这只会产生我们感兴趣的 'rows'。然后我们根据参数 x
.
我们使用 itertools.product
生成所有可能的 xy 坐标,并将它们用作 get_slice
的参数。
假设我有一个二维列表
001
111
111
而且我想获取二维列表的所有可能子集,这些子集是矩形的并且包含 grid[0][0]
处的左上角 element/the 元素(我不知道如何描述它)
它应该输出:
0
00
001
0
1
00
11
001
111
0
1
1
00
11
11
001
111
111
你如何获得所有可能的子集?我对如何实现它一无所知。
根据您的解释,我想出了以下解决方案:
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]]]
如果你想要更高阶的矩阵,那么你只需要将for i/j in range(2,4)
中的4变成你想要的数字即可。
一个简单的方法是:
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()
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
进行切片,这只会产生我们感兴趣的 'rows'。然后我们根据参数 x
.
我们使用 itertools.product
生成所有可能的 xy 坐标,并将它们用作 get_slice
的参数。