python-3.x - 如何根据子列表中的值过滤 2 级列表?
问题描述
认为下面的列表是一个表,其中 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]]
>>>
如何更好地获取列表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]]
该if j == 0
部分确保我们始终复制标题。您可以更改i_columns
以调整指标列的位置。
推荐阅读
- python - Python:遍历excel列并使用win32com获取值
- java - 写 C* 超时以不可预知的方式出现
- c# - 使用 TableAdapter 进行计数
- c# - emgucv c# OpenCv:u!=0 错误在 1920*1080p
- php - 可以向 SO 提供 phpinfo() 结果以破坏我的服务器的安全性吗?
- python - 如何使用相同的 Python 代码块处理异常和特定条件
- java - Java 时间转换
- excel - 循环遍历 VBA 中的单元格
- javascript - Wordpress 集成 tinyMCE 的方式是什么?
- wcf - WCF 单一方法不会被调用