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

时间:2016-12-16 01:49:56

标签: python

想象一下,您需要计算满足某些iterable的{​​{1}}元素的数量 - 是否有更好的方法来执行此操作? 它当然是python3。但是2也很好。 我无法在criteriacollections python模块或内置插件中找到任何合适的内容。

3 个答案:

答案 0 :(得分:4)

尝试quantify recipes中的itertools食谱:

def quantify(iterable, pred=bool):
    "Count how many times the predicate is true"
    return sum(map(pred, iterable))

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

>>> import more_itertools as mit

>>> iterable = [True, False, True, True]
>>> mit.quantify(iterable)
3

进行比较:

>>> #len(list(filter(lambda x: criteria, iterable)))
>>> len(list(filter(lambda x: x is True, iterable)))
3

<强>性能

# A: len(list(filter(lambda x: criteria, iterable)))
>>> %timeit -n 1000000 len(list(filter(lambda i: i is True, iterable)))
1000000 loops, best of 3: 2.48 µs per loop

# B: quantify(iterable, pred=condition)
>>> %timeit -n 1000000 mit.quantify(iterable)
1000000 loops, best of 3: 1.87 µs per loop

# C: ilen(item for item in iterable if condition)
>>> %timeit -n 1000000 mit.ilen(i for i in iterable if i is True)
1000000 loops, best of 3: 5.27 µs per loop

# D: len([item for item in iterable if condition])
>>> %timeit -n 1000000 len([i for i in iterable if i is True])
1000000 loops, best of 3: 973 ns per loop

# E: sum(1 for _ in iterable if condition)
>>> %timeit -n 1000000 sum(1 for i in iterable if i is True)
1000000 loops, best of 3: 1.34 µs per loop
  • A 控件 - 作者的例子
  • B 更快 - quantifyitertools食谱
  • C 最慢 - 生成器表达式,使用more_itertools.ilen进行评估
  • D 最快 - 列表理解
  • E 更快 - 生成器表达式,sum(1 for _ in ...)成语

虽然more_itertools.quantify是简洁的,但如果不是更快,那么惯用的生成器表达式就会相同。然而,经典列表理解(由@宏杰李首先提出)是表现最佳的。

另请参阅threadlen()扩展到生成器。

答案 1 :(得分:3)

sum(1 for i in A if condition(i))

答案 2 :(得分:1)

  

列表推导提供了创建列表的简明方法。共同   应用程序将创建新列表,其中每个元素都是结果   一些操作应用于另一个序列的每个成员或   可迭代的,或创建满足a的元素的子序列   某种条件。

>>> squares = []
>>> for x in range(10):
...     squares.append(x**2)
...
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
  

请注意,这会创建(或覆盖)名为x的变量   循环完成后存在。我们可以计算出正方形列表   没有任何副作用使用:

squares = list(map(lambda x: x**2, range(10)))
  

或等同于:

squares = [x**2 for x in range(10)]

而不仅仅是把你的条件放在像这样的if语句中

>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

您有一个符合条件的元素列表,您可以使用len(lsit_)来计算元素

List Comprehension Document