【发布时间】:2010-12-15 14:07:39
【问题描述】:
假设有一个包含数字和字母的列表 a。有没有快速的方法来找出列表不包含某些特定元素。我打算在条件下使用它。
【问题讨论】:
标签: python if-statement
假设有一个包含数字和字母的列表 a。有没有快速的方法来找出列表不包含某些特定元素。我打算在条件下使用它。
【问题讨论】:
标签: python if-statement
也许
3 not in [1, 2, "a"]
# True
【讨论】:
注意:如果您可以将元素作为 dict 的键,那么由于散列算法,测试成员身份会更快。仅当您的列表很长或您的应用程序做了很多此类事情时才会成为问题。否则,正如 Sven 所说,“X 不在 Y 中”。
【讨论】:
这取决于你想要做什么。如果速度无关紧要,则在 lst 中使用 a。如果这很重要,这将取决于您是否有能力先将列表转换为不同的数据结构(即您是否经常在说列表中查找项目)、大小等...
给出一个想法:
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 使用 hashtable,lists 需要一个接一个地查找每个项目。
如果项目具有可比性,您还可以通过对序列进行排序并使用二分搜索(log(N) 而不是 N,log(N) 相对较快,O(1) 对于 N 不太快),从而显着提高速度在实践中对于 python 来说很大),或者使用更高级的结构(二叉搜索树等)。它可能会变得相当复杂——用于快速搜索的数据结构毕竟是 CS 中研究最多的问题之一。
【讨论】:
timeit.Timer 的构造函数调用似乎有点冗长:)
你是说
bool([x for x in alist if isinstance(x, int)])
更好的版本(Sven Marnach):
any(isinstance(x, int) for x in alist)
?
【讨论】:
any(isinstance(x, int) for x in alist),因为这样更简洁,并且在找到的第一个 int 上停止迭代。但我不认为这是要求的。