更好/更快地遍历集合或列表?

2024-04-29 17:05:41 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有一个python列表,它有许多重复项,并且我想遍历每个项,但不遍历重复项,那么最好使用一个集合(如set(mylist)),还是找到另一种方法来创建一个没有重复项的列表?我只是想在列表中循环并检查重复项,但我想这就是初始化时set()所做的。

所以,如果mylist = [3,1,5,2,4,4,1,4,2,5,1,3]和我真的只想循环[1,2,3,4,5](顺序无关紧要),我应该使用set(mylist)或其他东西吗?

在上一个示例中,有一个替代方法是可能的,因为列表包含介于其最小值和最大值之间的每个整数,所以我可以循环range(min(mylist),max(mylist))set(mylist)。在这种情况下,我应该尽量避免使用set吗?另外,找到minmax比创建set慢吗?


在上一个例子中,set更快:

from numpy.random import random_integers
ids = random_integers(1e3,size=1e6)

def set_loop(mylist):
    idlist = []
    for id in set(mylist):
        idlist.append(id)
    return idlist

def list_loop(mylist):
    idlist = []
    for id in range(min(mylist),max(mylist)):
        idlist.append(id)
    return idlist

%timeit set_loop(ids)
#1 loops, best of 3: 232 ms per loop

%timeit list_loop(ids)
#1 loops, best of 3: 408 ms per loop

Tags: 方法integersloopidids列表fordef
3条回答

为了简单起见:newList = list(set(oldList))

但是如果你想获得速度/排序/优化,还有更好的选择:http://www.peterbe.com/plog/uniqifiers-benchmark

set是您想要的,因此您应该使用set。试图变得聪明会引入一些微妙的错误,比如忘记在max(mylist)中添加一个!防卫性密码。当你确定速度太慢时,就要担心速度会更快。

range(min(mylist), max(mylist) + 1)  # <-- don't forget to add 1

只需使用set。它的语义正是您想要的:一个独特项的集合。

从技术上讲,您将遍历列表两次:一次创建集合,一次用于实际循环。但你也可以用其他方法做同样多的工作。

相关问题 更多 >