python的len快捷方式(list(filter(lambda x:criteria,iterable)))

scy*_*gon 5 python

想象一下,你需要计算iterable满足某些元素的元素数量criteria- 是否有更好的方法来做到这一点?当然是python3.但是2也很好.我找不到任何合适的collectionsitertoolspython模块或内置插件.

pyl*_*ang 4

尝试食谱quantify中的食谱:itertools

\n\n
def quantify(iterable, pred=bool):\n    "Count how many times the predicate is true"\n    return sum(map(pred, iterable))\n
Run Code Online (Sandbox Code Playgroud)\n\n

more_itertools已经实现了这个配方,所以它更加紧凑:

\n\n
>>> import more_itertools as mit\n\n>>> iterable = [True, False, True, True]\n>>> mit.quantify(iterable)\n3\n
Run Code Online (Sandbox Code Playgroud)\n\n

用于比较:

\n\n
>>> #len(list(filter(lambda x: criteria, iterable)))\n>>> len(list(filter(lambda x: x is True, iterable)))\n3\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

表现

\n\n
# A: len(list(filter(lambda x: criteria, iterable)))\n>>> %timeit -n 1000000 len(list(filter(lambda i: i is True, iterable)))\n1000000 loops, best of 3: 2.48 \xc2\xb5s per loop\n\n# B: quantify(iterable, pred=condition)\n>>> %timeit -n 1000000 mit.quantify(iterable)\n1000000 loops, best of 3: 1.87 \xc2\xb5s per loop\n\n# C: ilen(item for item in iterable if condition)\n>>> %timeit -n 1000000 mit.ilen(i for i in iterable if i is True)\n1000000 loops, best of 3: 5.27 \xc2\xb5s per loop\n\n# D: len([item for item in iterable if condition])\n>>> %timeit -n 1000000 len([i for i in iterable if i is True])\n1000000 loops, best of 3: 973 ns per loop\n\n# E: sum(1 for _ in iterable if condition)\n>>> %timeit -n 1000000 sum(1 for i in iterable if i is True)\n1000000 loops, best of 3: 1.34 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • A :控制- 作者的例子
  • \n
  • B更快- quantifyitertools食谱
  • \n
  • C最慢- 生成器表达式,用于more_itertools.ilen评估
  • \n
  • D最快的列表理解
  • \n
  • Efaster - 生成器表达式,sum(1 for _ in ...)习语
  • \n
\n\n

虽然more_itertools.quantify很简洁,但惯用的生成器表达式即使不是更快,也是相当的。然而,经典的列表推导式(首先由 @\xe5\xae\x8f\xe6\x9d\xb0\xe6\x9d\x8e 建议)是表现最好的。

\n\n

另请参阅有关扩展到生成器的线程len()

\n