假设有一个包含数字和字母的列表。有没有快速的方法来找出该列表不包含某些特定元素。我计划在条件下使用它。
答案 0 :(得分:19)
也许
3 not in [1, 2, "a"]
# True
答案 1 :(得分:3)
注意:如果您可以将元素作为dict的键,那么由于使用散列算法,可以更快地测试成员资格。如果您的列表很长或者您的应用程序执行了很多此类操作,那么这只会是一个问题。否则,正如斯文所说,“X不在Y”。
答案 2 :(得分:2)
这取决于你想要做什么。如果速度无关紧要,那么请使用in lst。如果它确实重要,它将取决于您是否能够首先将您的列表转换为不同的数据结构(即您是否经常查找说明列表中的项目),大小等...
提出一个想法:
import timeit
a = range(10000)
da = dict(zip(a, [None for i in a]))
def list_first():
return 0 in a
def dict_first():
return 0 in da
def list_last():
return 9999 in a
def dict_last():
return 9999 in da
if __name__ == "__main__":
for f in ["list_first", "dict_first", "list_last", "dict_last"]:
t = timeit.Timer("%s()" % f, setup="from __main__ import %s" % f)
print min(t.repeat(number=10000))
这给了我:
0.00302004814148
0.00318598747253
4.21943712234
0.004145860672
如果您查找位于列表开头的项目,则使用dict不会像预期的那样加快速度。如果你在最后查找一个项目,那么差异是非常显着的(3个数量级),尽管如预期的那样:dict使用哈希表,列表需要一个接一个地查找每个项目。
如果项目具有可比性,您还可以通过对序列进行排序并使用二进制搜索来获得显着的加速(log(N)代替N,log(N)相对较快比较O(1)对于N不太在python实践中很大,或使用更高级的结构(二叉搜索树等)。它可能变得相当复杂 - 快速搜索的数据结构毕竟是CS中研究最多的问题之一。
答案 3 :(得分:0)
bool([x for x in alist if isinstance(x, int)])
更好的版本(由Sven Marnach撰写):
any(isinstance(x, int) for x in alist)