Подтвердить что ты не робот

Количество значений в списке, превышающем определенное число

У меня есть список чисел, и я хочу получить количество раз, когда число появляется в списке, который соответствует определенным критериям. Я могу использовать понимание списка (или понимание списка в функции), но мне интересно, есть ли у кого-то более короткий путь.

# list of numbers
j=[4,5,6,7,1,3,7,5]
#list comprehension of values of j > 5
x = [i for i in j if i>5]
#value of x
len(x)

#or function version
def length_of_list(list_of_numbers, number):
     x = [i for i in list_of_numbers if j > number]
     return len(x)
length_of_list(j, 5)

есть еще более сжатая версия?

4b9b3361

Ответ 1

Вы можете сделать что-то вроде этого:

>>> j = [4, 5, 6, 7, 1, 3, 7, 5]
>>> sum(i > 5 for i in j)
3

Вначале может показаться странным добавить True в True таким образом, но я не думаю, что это непитоносно; в конце концов, bool является подклассом int во всех версиях начиная с версии 2.3:

>>> issubclass(bool, int)
True

Ответ 2

Вы можете создать меньший промежуточный результат следующим образом:

>>> j = [4, 5, 6, 7, 1, 3, 7, 5]
>>> len([1 for i in j if i > 5])
3

Ответ 3

Если вы иначе используете numpy, вы можете сохранить несколько штрихов, но я не думаю, что он становится намного быстрее/компактнее, чем ответ senderle.

import numpy as np
j = np.array(j)
sum(j > i)

Ответ 4

A (несколько) разным образом:

reduce(lambda acc, x: acc + (1 if x > 5 else 0), j, 0)

Ответ 5

Если вы используете NumPy (как в ludaavic ответе), для больших массивов вы, вероятно, захотите использовать функцию NumPy sum, а не встроенную в Python sum для значительного ускорения - например, > 1000x ускорение для 10 миллионов элементов массива на моем ноутбуке:

>>> import numpy as np
>>> ten_million = 10 * 1000 * 1000
>>> x, y = (np.random.randn(ten_million) for _ in range(2))
>>> %timeit sum(x > y)  # time Python builtin sum function
1 loops, best of 3: 24.3 s per loop
>>> %timeit (x > y).sum()  # wow, that was really slow! time NumPy sum method
10 loops, best of 3: 18.7 ms per loop
>>> %timeit np.sum(x > y)  # time NumPy sum function
10 loops, best of 3: 18.8 ms per loop

(выше используется IPython %timeit "магия" для синхронизации)

Ответ 6

Различные способы подсчета с использованием модуля bisect:

>>> from bisect import bisect
>>> j = [4, 5, 6, 7, 1, 3, 7, 5]
>>> j.sort()
>>> b = 5
>>> index = bisect(j,b) #Find that index value
>>> print len(j)-index
3

Ответ 7

Я добавлю карту и версию фильтра, потому что почему бы и нет.

sum(map(lambda x:x>5, j))
sum(1 for _ in filter(lambda x:x>5, j))