我正在尝试创建一种在某些单元格(但不是全部)中都带有数字的矩形网格,这种方式很容易选择给定的行或列。
到目前为止,我所做的是创建网格中数字位置的列表以及网格中包含的数字列表,以便我可以使用{{选择位置(i,j)处的数字1}},但这不是很方便,特别是在例如需要在给定列中找到最小值的情况下。
是否有一种创建网格的方法,例如,我可以选择带有numbers[positions.index([i,j])
的元素和带有grid[i][j]
或类似元素的列?编程语言是Python。
答案 0 :(得分:0)
您可以为此使用numpy。它使您可以创建一个数组,该数组可以使用let html = data.categories.map(c => `<ul><li class="cat" catid=${c.id}><a
href="#">${c.name}</a></li></ul>`);
索引单个值或使用array[i,j]
索引整列。
我不完全确定孔的意思,但是numpy将要求您在数组的每个位置都有一个值。我相信最好的办法是将其设置为预设的“空”值。
答案 1 :(得分:0)
将网格存储为2D数组(矩阵),并使用list comprehensions。
first_column = [row[0] for row in grid]
second_column = [row[1] for row in grid]
答案 2 :(得分:0)
如果您将有很大一部分未使用的“单元格”,则可以尝试使用以坐标为键的字典作为元组中的键。
matrix = dict()
matrix[1,3] = 13
matrix[1,5] = 15
matrix[2,3] = 23
matrix[2,7] = 27
matrix[3,7] = 37
valuesInRow2 = [v for (r,c),v in matrix.items() if r==2]
# [23,27]
通过创建dict的子类来管理索引和重写运算符,您可以使其完全按照您想要的方式运行:
class Sparse(dict):
def __init__(self,rows=0,cols=0):
super().__init__()
self.rows = rows
self.cols = cols
def __indexToRanges(self,rowIndex,colIndex):
scalar = isinstance(rowIndex,int) and isinstance(colIndex,int)
if isinstance(rowIndex,slice):
rowRange = range(*rowIndex.indices(self.rows))
else:
rowRange = range(rowIndex,rowIndex+1)
if isinstance(colIndex,slice):
colRange = range(*colIndex.indices(self.cols))
else:
colRange = range(colIndex,colIndex+1)
return rowRange,colRange,scalar
def __getitem__(self,indexes):
row,col = indexes
rowRange,colRange,scalar = self.__indexToRanges(row,col)
if scalar: return super()._getitem((row,col))
return [v for (r,c),v in self.items() if r in rowRange and c in colRange]
def __setitem__(self,index,value):
row,col=index
rowRange,colRange,scalar = self.__indexToRanges(row,col)
if scalar:
self.rows = max(self.rows,row+1)
self.cols = max(self.cols,col+1)
return super().__setitem__((row,col),value)
用法:
matrix = Sparse()
matrix[1,3] = 13
matrix[1,5] = 15
matrix[2,3] = 23
matrix[2,7] = 27
matrix[3,7] = 37
print("sum of column 3:", sum(matrix[:,3]) ) # 36
print("sum of row 2:", sum(matrix[2,:]) ) # 50
print("top left 4x4 values:", matrix[:4,:4] ) # [13, 23]