当前位置: 首页 > 面试题库 >

有效检查元素是否在列表中至少出现了n次

南宫俊逸
2023-03-14
问题内容

如何最好地编写Python函数(check_list)以有效测试元素(x)是否至少出现在n列表(l)中几次?

我的第一个想法是:

def check_list(l, x, n):
    return l.count(x) >= n

但是,一旦x发现n次数,它就不会短路,并且始终为O(n)。

造成短路的简单方法是:

def check_list(l, x, n):
    count = 0
    for item in l:
        if item == x:
            count += 1
            if count == n:
                return True
    return False

我也有一个带有发电机的更紧凑的短路解决方案:

def check_list(l, x, n):
    gen = (1 for item in l if item == x)
    return all(next(gen,0) for i in range(n))

还有其他好的解决方案吗?什么是最有效的方法?

谢谢


问题答案:

而不会造成额外的开销用的设置的range对象,并使用all具有测试 感实性
每一个项目,你可以使用itertools.islice推动发电机n提前步骤,然后返回
下一个 切片项目,如果切片存在或默认False,如果不:

from itertools import islice

def check_list(lst, x, n):
    gen = (True for i in lst if i==x)
    return next(islice(gen, n-1, None), False)

注意like list.countitertools.islice也以C速度运行。这具有处理非列表的可迭代对象的额外优势。

一些时间:

In [1]: from itertools import islice

In [2]: from random import randrange

In [3]: lst = [randrange(1,10) for i in range(100000)]

In [5]: %%timeit # using list.index
   ....: check_list(lst, 5, 1000)
   ....:
1000 loops, best of 3: 736 µs per loop

In [7]: %%timeit # islice
   ....: check_list(lst, 5, 1000)
   ....:
1000 loops, best of 3: 662 µs per loop

In [9]: %%timeit # using list.index
   ....: check_list(lst, 5, 10000)
   ....:
100 loops, best of 3: 7.6 ms per loop

In [11]: %%timeit # islice
   ....: check_list(lst, 5, 10000)
   ....:
100 loops, best of 3: 6.7 ms per loop


 类似资料:
  • 问题内容: 我正在python中使用该库,并且希望保持队列条目唯一。 因此,我想在添加到队列之前检查队列中是否没有“某物”,本质上是这样的函数,它可以在队列库中工作: 还是我应该使用其他库/方法来实现这一目标? 问题答案: 标准类不能被迭代或检查。 但是,它被构建为可扩展。 首先,如果你看一下源(这是从文档的链接),有钩的方法,,并且可以覆盖改变实现。查看主类下面的子类,您可以看到它们是如何做到的

  • 问题内容: 我有这样的df: 以及物品清单: 我的目标是从中获取至少包含2个元素的所有行。 我想出了以下解决方案: 这给了我我想要的,但是就可伸缩性而言,它可能不是最佳的解决方案。是否有任何“向量化”解决方案?谢谢 问题答案: 我会建立一个Series列表,然后应用vectorized : 它给出了预期的结果:

  • 问题内容: 我需要以下功能: 输入: 输出: 如果输入列表中的所有元素使用标准相等运算符求值彼此相等; 除此以外。 性能:当然,我不希望产生任何不必要的开销。 我觉得最好: 遍历列表 比较相邻元素 和AND所有结果布尔值 但我不确定最Pythonic的方法是什么。 问题答案: 通用方法: 单线: 也是单线的: 这三个版本之间的区别在于: 在内容中必须是可哈希的。 并且可以使用任何迭代器,但chec

  • 问题内容: 我正在尝试比较两个列表,如果第二个列表中有第一个列表中的任何值,则只打印一条消息。 在此示例中,我要对进行求值,因为两个列表中都包含5。这行不通,而且我不确定比较这两个列表的最简单方法。 问题答案: 您可以用很多方法解决。一个很容易理解的方法就是只使用一个循环。 一个更紧凑的方法是使用和: 更好的是,可以将其替换为: 您还可以使用集合:

  • 问题内容: 假设我有一个列表, 并且我想知道其中的至少一个数字是否存在于另一个列表中,例如这个列表: 换句话说,我想知道list中是否存在1,2或3 。我现在可以做类似的事情 但是,是否可能有一种方法可以使事情整齐? 问题答案: 有很多方法可以做到这一点。最直接的翻译是: 您还可以使用各种涉及集合的东西,例如: (这取决于元素是可哈希的,但如果这是真的,这很可能会更快地制定一套较大的出来的,并为任

  • 问题内容: 目前,我正在这样做: 但是我想要一个可以放在简单语句中的表达式。是否有内置的东西可以使这段代码显得不太笨拙? 如果iterable为空,则返回,但如果不是,则可能会遍历所有项目。我只需要检查第一项即可。 有人问我要做什么。我编写了一个函数,该函数执行SQL查询并产生其结果。有时,当我调用此函数时,我只是想知道查询是否返回了任何内容,并据此做出决定。 问题答案: 如果为True,则不会超