Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何根据子列表中的值筛选2级列表?_Python 3.x_List_Filter - Fatal编程技术网

Python 3.x 如何根据子列表中的值筛选2级列表?

Python 3.x 如何根据子列表中的值筛选2级列表?,python-3.x,list,filter,Python 3.x,List,Filter,假设下面的列表是一个表,其中子列表[0]包含列标题 data = [ ['S1', 'S2 ', 'ELEMENT', 'C1', 'C2'], ['X' , 'X' , 'GRT' , 1, 4 ], ['' , 'X' , 'OIP' , 3, 2 ], ['' , 'X' , 'LKJ' , 2, 7 ],

假设下面的列表是一个表,其中子列表[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  ]
        ]
下面我展示了到目前为止我拥有的代码,在这里我复制了一份源列表
数据
然后检查哪个子列表在“列S1”中没有“X”。我在新列表中获得了正确的内容
S1
, 但是我不知道为什么源列表
数据
正在被修改,我无法使用它来获取新列表
S2

S1=数据
对于S1[1:]中的子列表:
如果子列表[0]!=“X”:
s1.删除(子列表)
s2=数据
对于S2[1:]中的子列表:
如果子列表[1]!=“X”:
s2.删除(子列表)
>>>资料
[['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]]
>>> 

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

您的问题是,简单地将列表分配给一个新名称并不会产生副本

您可以通过执行以下操作使您的解决方案起作用

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

如果j==0,则
部分确保我们始终复制标题。您可以更改
i\u列
以调整指示器列的位置。

您好,非常感谢您的帮助。它工作得很好。我是python新手,我正在努力理解您的代码。在实际列表中,从S1到S4有“列”,这些区分列从第3列到第6列。如何调整您的代码,使其能够在特定位置(例如第3列到第6列)使用区分列?@GerCas现在可以处理任意区分列位置。非常好!非常感谢你的帮助和时间。它工作得很好。