【问题标题】:Python, find out that a list does not have specific itemPython,找出一个列表没有特定的项目
【发布时间】:2010-12-15 14:07:39
【问题描述】:

假设有一个包含数字和字母的列表 a。有没有快速的方法来找出列表不包含某些特定元素。我打算在条件下使用它。

【问题讨论】:

    标签: python if-statement


    【解决方案1】:

    也许

    3 not in [1, 2, "a"]
    # True
    

    【讨论】:

    • @A A:OP 要求检查一个元素是否在列表中。很可能该列表不会在他的代码中硬编码。
    【解决方案2】:

    注意:如果您可以将元素作为 dict 的键,那么由于散列算法,测试成员身份会更快。仅当您的列表很长或您的应用程序做了很多此类事情时才会成为问题。否则,正如 Sven 所说,“X 不在 Y 中”。

    【讨论】:

    • 这种情况下也可以使用集合。
    • 如果您对 dict 值没有用处,您应该使用集合。
    【解决方案3】:

    这取决于你想要做什么。如果速度无关紧要,则在 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 中研究最多的问题之一。

    【讨论】:

    • 这里是使用集合而不是字典的更简洁的代码版本:gist.github.com/742056。特别是您对timeit.Timer 的构造函数调用似乎有点冗长:)
    【解决方案4】:

    你是说

    bool([x for x in alist if isinstance(x, int)])
    

    更好的版本(Sven Marnach):

    any(isinstance(x, int) for x in alist)
    

    ?

    【讨论】:

    • 如果这确实是 OP 想要的,最好将其写为any(isinstance(x, int) for x in alist),因为这样更简洁,并且在找到的第一个 int 上停止迭代。但我不认为这是要求的。
    猜你喜欢
    • 2023-01-22
    • 2013-08-06
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 2023-03-31
    • 2011-08-08
    • 2020-05-04
    相关资源
    最近更新 更多