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)
为简单起见: newList = list(set(oldList))
但如果您想获得速度/订购/优化,那么有更好的选择:http://www.peterbe.com/plog/uniqifiers-benchmark
虽然a set
可能是你想要的结构,但问题是什么更快.列表更快.您的示例代码不准确比较set
VS 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)