【问题标题】:Delete Column IF all column cell contain NULL value [closed]如果所有列单元格包含NULL值,则删除列[关闭]
【发布时间】:2013-08-03 14:56:25
【问题描述】:

我需要一些帮助来解决这个 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

附言我知道我必须反过来做,但我对这个逻辑更感兴趣。

【问题讨论】:

  • 您提供的代码不是一个尝试的解决方案 - 它只是打印出数据。你需要尝试做你想做的事,然后如果你有问题,回来询问那个具体的问题。
  • 但这就是我卡住的地方,我做了我的研究并没有发现任何东西。我只需要真正自己解决的逻辑。
  • 如果你真的想不出最幼稚的方法来解决这个问题,我建议你在继续之前阅读一些基本的编程教程以掌握基础知识。
  • 好的,我会添加我的想法。
  • 我已经添加了我的想法,所以现在我可以找到“-”的位置。

标签: python loops matrix


【解决方案1】:

好的,既然我们已经看到了你的尝试,我建议你掌握一些Python的概念,了解Python的库和builtins,尤其是这种情况下,你需要了解zip和@ 987654323@。您还需要了解可迭代和列表理解。

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']), (['-'], ['-'], ['-'])]

一旦您将所有 Column 数据放在一行中,您的下一个尝试应该是找出哪一行包含所有 ['-']。您可以使用内置的all,如果所有元素都为真,则返回真。

您还需要知道如何浏览转置矩阵中的行。列表理解和/或生成器表达式很方便

[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)))

【讨论】:

  • 感谢您的时间和精力,我已带您上船并会做我的研究。谢谢!
【解决方案2】:

如果你需要自己做,你会怎么做?英文

阅读专栏, 如果该列仅包含“-”,则将其删除

阅读专栏: 矩阵[0-N][列号]上的循环 如果遇到“-”以外的其他内容,请将变量设置为 false

删除一列: 在 Matrix[0-n][column number] 上循环并删除每个元素

您需要了解以下内容:

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

【讨论】:

  • 感谢您的详细描述,它确实帮助我理解了您的脚本。我希望我能接受这两个答案!
猜你喜欢
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 1970-01-01
  • 2018-08-18
  • 1970-01-01
  • 2020-02-08
  • 2017-06-20
  • 2018-10-06
相关资源
最近更新 更多