从列表的列表中移除包含特定字符串'none'的子列表
解决方法:高效过滤含特定关键词的子列表
嘿,你的需求其实用Python的列表推导式就能完美解决,而且完全适配你这个百万级别的大列表场景,性能拉满!
核心代码
直接用一行列表推导式就能搞定:
filtered_sentences = [sublist for sublist in sentences_fam if 'none' not in sublist]
代码解释
- 我们遍历
sentences_fam里的每一个子列表sublist - 只保留那些**不包含字符串'none'**的子列表,自动过滤掉所有带'none'的条目
- 这个方式是Python里处理批量过滤最高效的方式之一,因为列表推导式是底层用C实现的,比手动写
for循环加append快得多,对于150多万条数据来说,效率提升非常明显
为什么不用DataFrame?
你之前尝试转DataFrame遇到的问题很正常——因为子列表长度不一致,pandas会把每个元素拆成单独的列,反而破坏了你需要的"列表的列表"结构。对于这种要直接喂给word2vec的文本结构,原生列表操作才是最直接、最高效的选择,完全没必要绕远路用pandas。
可选:大小写不敏感过滤(如果需要)
如果你的数据里可能存在'None'、'NONE'这类大小写变体,想要一起过滤的话,可以改成:
filtered_sentences = [sublist for sublist in sentences_fam if not any(item.lower() == 'none' for item in sublist)]
不过看你给的示例数据都是小写的'none',所以第一个版本就足够了。
效果验证
用你给出的示例输入测试:
输入:
sentences_fam = [['30973', 'ok'], ['3044', 'ok'], ['53690', 'fd', '65', 'ca'], ['36471', 'none','good','standing'], ['j6426', 'none'], ['500861', 'm', 'br'], ['j0076', 'none'], ['mf4422', 'ok'], ['jf1816', 'father', '64', 'ca'], ['500854', 'no', 'fam', 'none', 'hx'], ['54480n', 'none'], ['mf583', 'none']]
运行代码后得到的filtered_sentences就是你期望的输出:
[['30973', 'ok'], ['3044', 'ok'], ['53690', 'fd', '65', 'ca'], ['500861', 'm', 'br'], ['mf4422', 'ok'], ['jf1816', 'father', '64', 'ca']]
这个方法内存占用也很合理,生成的新列表直接可以传入word2vec库使用,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Marinos Rrapaj
相关产品推荐
相关产品推荐

