Python:使用列表推导更快速地过滤列表

14 浏览
0 Comments

Python:使用列表推导更快速地过滤列表

考虑以下问题:我想保留属于list2的list1的元素。所以我可以这样做:\nfiltered_list = [w for w in list1 if w in list2]\n我需要对不同的list1示例(大约20000个不同的示例)和一个“常量”(冻结)的list2重复这个相同的过程。\n如何加快速度?\n我还知道以下属性:\n1)list1有重复元素,没有排序,并且大约有10000个项目。\n2)list2是一个巨大的排序列表(Python中约有200000个条目),每个元素都是唯一的。\n我首先想到的是也许我可以使用一种二分搜索。然而,在Python中有没有一种方法可以做到这一点?\n此外,如果filtered_list具有与list1相同的项目顺序,我并不介意。所以,也许我可以只检查一个不重复的list1版本,然后在删除不属于list2的list1元素后,返回重复的项目。\n在Python 3中有一种快速的方法吗?

0
0 Comments

Python: 使用列表推导式更快地过滤列表的方法

问题的出现原因是,在给定两个列表list1和list2的情况下,需要通过list1中的元素是否在list2中来过滤出一个新的列表。最初的解决方法是使用列表推导式,遍历list1中的每个元素,判断其是否在list2中。然而,这种方法是顺序查找的,效率较低。为了提高效率,可以将list2转换为一个set集合,并使用集合的机制进行快速查找。具体操作是先将list2转换为set2,然后使用列表推导式对list1进行过滤,只保留在set2中存在的元素。

如果list1中没有重复的元素,可以将list1和list2都转换为集合,并取集合的交集来实现过滤。但是,由于list1中存在重复的元素,无法直接使用集合的交集操作。因此,只能使用遍历list1的方法来进行过滤操作。

另外,如果想要找出list1中需要删除的元素,可以使用集合的差集操作,即set1 - set2。但是,无论是过滤保留元素还是删除元素,都需要遍历list1,因此在性能上并没有区别。

针对评论中的问题,如果set2是一个frozen set(不可变集合)或者无关紧要,可以对list1进行预处理,将其转换为一个字典,其中每个单词对应出现的次数。这样做可能会提高性能,但是需要考虑到转换过程也涉及遍历操作,因此可能并没有明显的性能优势。关于这一点,可以参考collections.Counter类,它可以用来统计元素出现的次数。

总结起来,为了更快地过滤列表,可以将list2转换为set集合,并使用集合的机制进行快速查找。如果list1中没有重复的元素,还可以将list1和list2都转换为集合,并取集合的交集来实现过滤。如果需要找出list1中需要删除的元素,可以使用集合的差集操作。同时,可以考虑使用collections.Counter类来统计元素出现的次数,以提高性能。

0