我需要一些有关此Python问题的帮助。
我有一张名为Matrix的表 -
Matrix = [[['23'],['47'],['35'],['-']],
[['45'],['22'],['34'],['-']],
[['11'],['43'],['22'],['-']]]
我想做的是 -
删除/删除整个列如果它的所有单元格值都包含空值,如“ - ”。
我已经有一个函数可以通过索引删除整个COLUMN,但在我能够做到这一点之前,我需要找到一种方法来知道该特定列中的每个单元格是否包含“ - ”,然后才能删除它。
找到“ - ” -
for i, row in enumerate(Matrix):
for x, col in enumerate(row):
print Matrix[i][x], i, x
输出 -
['23'] 0 0
['47'] 0 1
['35'] 0 2
['-'] 0 3
['45'] 1 0
['22'] 1 1
['34'] 1 2
['-'] 1 3
['11'] 2 0
['43'] 2 1
['22'] 2 2
['-'] 2 3
从中我可以看到第3列中每个单元格中都存在“ - ”。
我的尝试 -
for i, row in enumerate(Matrix):
for x, col in enumerate(row):
if "-" in col:
print "Column to Delete is", x
P.S。我知道我必须反过来这样做,但我对这个逻辑更感兴趣。
答案 0 :(得分:0)
好的,现在我们已经看到了你的尝试,我建议你掌握Python的一些概念并理解Python的库和builtins,esp,在这种情况下,你需要理解{{3 }和zip。您还需要了解iterable和List Comprehension。
Zip是一个很棒的函数,在转置Matrix时可以使用splat运算符*
。在这种情况下,由于您可以通过索引而不是列来访问行(与Numpy不同),您的第一次尝试应该是转置数据。
>>> Matrix = [[['23'],['47'],['35'],['-']],
[['45'],['22'],['34'],['-']],
[['11'],['43'],['22'],['-']]]
>>> zip(*Matrix)
[(['23'], ['45'], ['11']), (['47'], ['22'], ['43']), (['35'], ['34'], ['22']), (['-'], ['-'], ['-'])]
一旦您将所有列数据放在一行中,您的下一次尝试应该是找出哪一行包含所有[' - ']。您可以使用内置all,如果所有元素都为真,则返回true。
您还需要了解如何浏览转置矩阵中的行。列表理解和/或生成器表达非常方便
[row for row in zip(*Matrix) if all(e != ['-'] for e in row)]
这是以下循环的等效简明符号
_Matrix = []
for row in zip(*Matrix):
#all(e != ['-'] for e in row)
_cond = True
for e in row:
if e != ['-']:
_cond = False
break
if not _cond:
_Matrix.append(e)
现在,一旦删除目标行,您需要转置数据以获取原始表单,删除所有[' - ']删除列
zip(*(row for row in zip(*Matrix) if all(e != ['-'] for e in row)))
答案 1 :(得分:0)
如果你自己需要这样做,你会怎么做?用英语
阅读专栏, 如果列只包含“ - ”则删除它
阅读专栏: 矩阵循环[0-N] [列号] 如果你输入“ - ”
之外的其他内容,则将变量设置为false删除列: 在Matrix [0-n] [列号]上循环并删除每个元素
您需要了解以下内容:
How to know the number of lines : len(Matrix)
how to know the number of column : len(Matrix[0])
How to remove a element : del matrix[rowNumber][columnNumber]
它为您提供以下内容(比其他新手更容易理解):
# --*-- encoding: iso-8859-1 --*--
def getMatrixNumberOfRows(Matrix):
return len(Matrix)
def getMatrixNumberOfColumns(Matrix):
return len(Matrix[0])
def mustColumnBeDeleted(Matrix, columnNumber):
mustBeDeleted = True
for rowNumber in range(0, getMatrixNumberOfRows(Matrix)):
if Matrix[rowNumber][columnNumber] != ['-']:
mustBeDeleted = False
return mustBeDeleted
def deleteColumn(Matrix, columnNumber):
for rowNumber in range(0, getMatrixNumberOfRows(Matrix)):
del Matrix[rowNumber][columnNumber]
def printMatrix(Matrix):
for row in Matrix:
print row
#program
Matrix = [[['23'],['47'],['35'],['-']],
[['45'],['22'],['34'],['-']],
[['11'],['43'],['22'],['-']]]
for columnNumber in range(0, getMatrixNumberOfColumns(Matrix)):
if mustColumnBeDeleted(Matrix, columnNumber) == True:
deleteColumn(Matrix, columnNumber)
printMatrix(Matrix)
输出:
[['23'], ['47'], ['35']]
[['45'], ['22'], ['34']]
[['11'], ['43'], ['22']]