python - 更快地查找哪些列表共享元素
问题描述
我有一个形状为 (142000, 1) 的熊猫数据框,其中有一列名为关键字,其中每个单元格都包含一个关键字列表。
我想检查哪些行至少有一个相等的关键字。
for i in combinations(list(range(len(df.index))), 2):
if set(df['keywords'][i[0]]) & set(df['keywords'][i[1]]):
do_something() # this runs reasonably fast, no problem here
设置的东西如下set([1,2,3]) & set([3,4,5]) = {3}
:所以实际上只是检查列表是否共享任何项目。
问题在于暴力破解它,因为我们总共有 142000!/[(142000 - 2)!2!] 次迭代。
有一个更好的方法吗?
解决方案
创建一个从关键字到该关键字出现的所有索引的索引(我对 Pandas 不太熟悉,因此您可能需要修复一些问题):
keyword_index = defaultdict(set)
for i, keywords in enumerate(df['keywords']):
for keyword in keywords:
keyword_index[keyword].add(i)
然后遍历索引并对出现在多个索引处的所有关键字做一些事情:
for keyword, indices in keyword_index.items():
if len(indices) >= 2:
do_something()
您必须决定如何处理出现在两行以上的关键字。如果你想分别处理每个组合,它仍然是原始代码中最坏的情况 O(n^2) 。
推荐阅读
- javascript - MermaidJs - 来自某个节点的单击事件错误
- c++ - 如何在 c++ 中捕获 map.at 错误的超出范围错误?
- python - 将两个或更多参数传递给 Oracle SQL
- javascript - Discord 机器人回复每次增加 1
- python - 在python中打印字典值和键(索引)
- codeigniter-4 - 在 ci4 中删除 index.php 但没有任何反应
- php - PHP jQuery Tabledit 选择选项
- python - 刮问题。为什么没有数据被抓取?
- javascript - 为什么我的 SCSS 文件在导入后没有应用到我的 React 中?
- flutter - Flutter 和 Dart 扩展