【问题标题】:How to delete a row from a 2D list based on specific column values?如何根据特定列值从二维列表中删除一行?
【发布时间】:2016-06-19 05:48:09
【问题描述】:

例如,我们有这个 2D 列表:

list1 = [['tom',67,'engineer',2],
     ['ron',42,'scientist',4],
      ['alie',56,'doctor',3],
      ['rambo',29,'lawyer',7]]

现在我必须删除第 4 列具有奇数的行。 python3 中是否有任何方法可以使用pop 或其他方式来执行此操作?

【问题讨论】:

    标签: python python-3.x multidimensional-array


    【解决方案1】:

    list1 创建新列表的最简单方法。如果您想替换它,可以将其分配给list1。您可以使用:

    list2 = [v for v in list1 if v[3] % 2 == 0]
    

    在您的示例中,list2 获得以下值:

    [['tom', 67, 'engineer', 2],
     ['ron', 42, 'scientist', 4]]
    

    如果你只是想用新列表替换list1,你可以直接这样做:

    list1 = [v for v in list1 if v[3] % 2 == 0]
    

    如果您需要保留对 list1 的引用,您可以使用以下命令更改现有列表:

    list1[:] = [v for v in list1 if v[3] % 2 == 0]
    

    【讨论】:

    • 查看我的编辑。底线显示了如何破坏性地修改list1 以包含过滤列表。对list1 的任何现有引用都将采用这些更改。
    • 先生,这里的保留引用是什么意思?
    • 这就是您所要求的。您想修改list1,而不是为其分配新值。不同之处在于,如果您在执行更新之前执行x = list1,那么如果您破坏性地修改list1x 将反映这些更改。如果您只是分配给list1,那么x 将保留旧值。
    • 你好先生,我可以在这里使用 if v[2] == 'scientist' and v[3] %2==0 这样的东西吗?
    • 是的,你可以使用你喜欢的表达式,它应该可以工作。
    【解决方案2】:

    使用remove 的解决方案。很容易理解你。

    for value in list1[:]:
        if value[3] % 2 != 0:
            list1.remove(value)
    

    结果

    [['tom', 67, 'engineer', 2], ['ron', 42, 'scientist', 4]]
    

    【讨论】:

      最近更新 更多