想象一下,你需要计算iterable满足某些元素的元素数量criteria- 是否有更好的方法来做到这一点?当然是python3.但是2也很好.我找不到任何合适的collections或itertoolspython模块或内置插件.
尝试食谱quantify中的食谱:itertools
def quantify(iterable, pred=bool):\n "Count how many times the predicate is true"\n return sum(map(pred, iterable))\nRun Code Online (Sandbox Code Playgroud)\n\nmore_itertools已经实现了这个配方,所以它更加紧凑:
>>> import more_itertools as mit\n\n>>> iterable = [True, False, True, True]\n>>> mit.quantify(iterable)\n3\nRun 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\nRun Code Online (Sandbox Code Playgroud)\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\nRun Code Online (Sandbox Code Playgroud)\n\nquantify,itertools食谱more_itertools.ilen评估sum(1 for _ in ...)习语虽然more_itertools.quantify很简洁,但惯用的生成器表达式即使不是更快,也是相当的。然而,经典的列表推导式(首先由 @\xe5\xae\x8f\xe6\x9d\xb0\xe6\x9d\x8e 建议)是表现最好的。
另请参阅有关扩展到生成器的线程len()。
| 归档时间: |
|
| 查看次数: |
529 次 |
| 最近记录: |