更好/更快地循环设置或列表?

ask*_*han 36 python loops list set

如果我有一个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?还有,会发现min并且max比创建它更慢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
Run Code Online (Sandbox Code Playgroud)

Eev*_*vee 39

只需使用一个set.它的语义正是你想要的:一系列独特的物品.

从技术上讲,你将在列表中迭代两次:一次创建集合,一次用于实际循环.但是你可以用任何其他方法做同样多的工作或更多.


Joh*_*ooy 10

set是你想要的,所以你应该使用set.试图聪明地介绍一些细微的错误,比如忘记添加一个max(mylist)!代码防守.当你确定速度太慢时,担心什么会更快.

range(min(mylist), max(mylist) + 1)  # <-- don't forget to add 1
Run Code Online (Sandbox Code Playgroud)


Gor*_*ard 5

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

但如果您想获得速度/订购/优化,那么有更好的选择:http://www.peterbe.com/plog/uniqifiers-benchmark

  • 没有充分的理由回到列表.在将它转换为集合时,他已经丢失了元素顺序,因此没有理由不使用该集合. (4认同)

ham*_*x0r 5

虽然a set可能是你想要的结构,但问题是什么更快.列表更快.您的示例代码不准确比较setVS list因为你从列表转换为一组 set_loop,然后你创建list你会通过循环 list_loop.迭代的集合和列表应该提前构建并在内存中,并且只需循环查看迭代时哪个数据结构更快:

ids_list = range(1000000)
ids_set = set(ids)
def f(x):
    for i in x:
         pass

%timeit f(ids_set)
#1 loops, best of 3: 214 ms per loop
%timeit f(ids_list)
#1 loops, best of 3: 176 ms per loop
Run Code Online (Sandbox Code Playgroud)