Python 3.x 如何根据子列表中的值筛选2级列表?
假设下面的列表是一个表,其中子列表[0]包含列标题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 ],
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现在可以处理任意区分列位置。非常好!非常感谢你的帮助和时间。它工作得很好。