删除列如果所有列单元格都包含NULL值

时间:2013-08-02 10:54:48

标签: python loops matrix

我需要一些有关此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。我知道我必须反过来这样做,但我对这个逻辑更感兴趣。

2 个答案:

答案 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']]