【问题标题】:What is the most efficient way to the determine items of a list which are greater than a threshold?确定列表中大于阈值的项目的最有效方法是什么?
【发布时间】:2019-03-17 00:55:39
【问题描述】:

基本上,我想知道什么是最有效的方法来查找值大于 n 的 python 列表中的元素。

我相信,最简单但效率不高的方法如下,

for i in range(len(theList)):
    if theList[i] > n:
        subList.append(theList[i])

此外,我们有如下单行for

(subList for subList in theList if sublist > n)

(以上语法如有错误请指正)

最后,我们可以使用filter() 函数了,至少对我来说用起来并不愉快。

以上方法都是我所知道的方法。如果您知道任何更好的方法,请告诉我。否则,请从效率和运行时的角度解释哪个是最好的。

【问题讨论】:

  • 为什么filter 不适合你?
  • 如果你只是想返回一个只有值大于n的元素的列表,那么你的理解是一个很好的方法。如果你的意思是返回一个列表而不是一个生成器,你可以将它修改为[elem for elem in elems if elem > n]
  • @benvc 我在询问运行时间的比较。提到的问题只是指出方法。

标签: python list runtime list-comprehension


【解决方案1】:

对此没有总是正确的答案,并且有一些关于处理列表时不同方法的速度的SO帖子,请参阅例如hereherehere

最快的方法可能很大程度上取决于您的列表。 这就是说,让我们看看建议的方法有多快。

对于像这样的简单比较,您可以使用timeit

1.案例:for循环

for_case = """newList=[]
for x in theList:
    if x > n:
            newList.append(x)"""

2。案例:列表理解

list_comp = '[x for x in theList if x > n]'

3.案例:过滤器(有点不像)

filtering = 'list(filter(lambda x: x > n, theList))'

一些准备工作:

import timeit
si = 'theList=range(2000);n=1000;'  # using list(range(2000)) has no effect on the ranking

让我们看看:

timeit.timeit(si+list_comp, number=10000)
Out[21]: 1.3985847820003983
timeit.timeit(si+filtering, number=10000)
Out[22]: 3.315784254024038
timeit.timeit(si+for_case, number=10000)
Out[23]: 2.0093530920275953

因此,至少在我的机器上,列表理解将其删除,然后是 for-循环,至少在这种情况下,不受欢迎的 filter 确实是最慢的。

【讨论】:

  • 谢谢。我相信这是最终的答案:) 现在唯一需要解决的问题是是否还有其他方法可以做到这一点?
  • @HosseinRahimi 欢迎您。 SO上有一些关于速度的问题,例如hereherehere。如果您对此主题感兴趣,所有这些都是很好的阅读!
  • 这个答案与已经发布的答案有何不同?是否需要 for 循环?还是过滤器?
  • @HosseinRahimi 当然还有其他方法,但是当谈到最快的方法时,我认为这 3 种方法差不多。
【解决方案2】:

列表理解版本:

sublist = [ i for i in the_list if i > n ]

生成器表达式:(如果列表很大)

sublist = ( i for i in the_list if i > n )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多