【问题标题】:How to filter a 2 level list based on values within sublists?如何根据子列表中的值过滤 2 级列表?
【发布时间】:2020-07-06 06:51:16
【问题描述】:

认为下面的列表是一个表格,其中 sublist[0] 包含列标题。

data = [
            ['S1', 'S2 ', 'ELEMENT', 'C1', 'C2'], 
            ['X' ,  'X' , 'GRT'    ,  1,    4  ], 
            [''  ,  'X' , 'OIP'    ,  3,    2  ], 
            [''  ,  'X' , 'LKJ'    ,  2,    7  ], 
            ['X' ,  ''  , 'UBC'    ,  1,    0  ]
        ]
    

我正在尝试根据“列 S1”和“列 S2”中的值过滤列表。

我想得到:

  • 一个新列表“S1”,其中包含“S1 列”中具有“X”的子列表
  • 一个新列表“S2”,其中包含在“列 S2”中具有“X”的子列表

像这样:

S1 = [
            ['ELEMENT', 'C1', 'C2'], 
            ['GRT',      1,    4  ], 
            ['UBC',      1,    0  ]
        ]       

S2 = [
            ['ELEMENT', 'C1', 'C2'], 
            ['GRT',      1,    4  ], 
            ['OIP',      3,    2  ], 
            ['LKJ',      2,    7  ]
        ]

下面我展示了到目前为止的代码,我在其中复制了源列表data,然后检查哪个子列表在“列 S1”中没有“X”。我在新列表S1 中得到正确的内容, 但我不知道为什么要修改源列表data,我不能用它来获取新列表S2

S1 = data
for sublist in S1[1:]:
    if sublist[0] != "X":
            s1.remove(sublist)

s2 = data
for sublist in S2[1:]:
    if sublist[1] != "X":
            s2.remove(sublist)


>>> data
[['S1', 'S2 ', 'ELEMENT', 'C1', 'C2'], ['X', 'X', 'GRT', 1, 4], ['X', '', 'UBC', 1, 0]]
>>> S1
[['S1', 'S2 ', 'ELEMENT', 'C1', 'C2'], ['X', 'X', 'GRT', 1, 4], ['X', '', 'UBC', 1, 0]]
>>> 

如何更好地获取列表S1S2?谢谢。

【问题讨论】:

    标签: python-3.x list filter


    【解决方案1】:

    您的问题是因为简单地将列表分配给一个新名称不会复制。

    您也许可以通过以下方式使您的解决方案发挥作用

    S1 = data[:]  # slicing makes a copy
    S2 = data[:]
    

    改为。


    这是一个通用的解决方案:

    def split_from_columns(ls, i_columns=(), indicator='X'):
        for i in i_columns:
            yield [
                [v for k, v in enumerate(sl) if k not in i_columns]
                for j, sl in enumerate(ls)
                if j == 0 or sl[i] == indicator
            ]
    

    用法:

    >>> S1, S2 = split_from_columns(data, i_columns=(0, 1))
    >>> S1
    [['ELEMENT', 'C1', 'C2'], ['GRT', 1, 4], ['UBC', 1, 0]]
    >>> S2
    [['ELEMENT', 'C1', 'C2'], ['GRT', 1, 4], ['OIP', 3, 2], ['LKJ', 2, 7]]
    

    if j == 0 部分确保我们始终复制标题。您可以更改i_columns 以调整指标列的位置。

    【讨论】:

    • 您好,非常感谢您的帮助。它工作得很好。我是 python 新手,我正在尝试理解您的代码。在实际列表中,从 S1 到 S4 有“列”,这些区分列是从第 3 列到第 6 列。如何调整您的代码以能够在特定位置(例如第 3 列到第 6 列)采用区分列?
    • @GerCas 现在可用于任意区分列位置。
    • 太棒了!非常感谢您的帮助和时间。它工作得很好。
    猜你喜欢
    • 1970-01-01
    • 2021-06-17
    • 2018-10-10
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 2019-09-03
    相关资源
    最近更新 更多