Убедитесь, что все значения в списке больше определенного номера
my_list1 = [30,34,56]
my_list2 = [29,500,43]
Как проверить, есть ли все значения в списке >= 30? my_list1
должен работать, а my_list2
не должен.
Единственное, что я мог подумать, это:
boolean = 0
def func(ls):
for k in ls:
if k >= 30:
boolean = boolean + 1
else:
boolean = 0
if boolean > 0:
print 'Continue'
elif boolean = 0:
pass
Обновление 2016:
Оглядываясь назад, имея дело с более крупными наборами данных, где скорость действительно имеет значение и использует numpy
... Я бы сделал это:
>>> my_list1 = [30,34,56]
>>> my_list2 = [29,500,43]
>>> import numpy as np
>>> A_1 = np.array(my_list1)
>>> A_2 = np.array(my_list2)
>>> A_1 >= 30
array([ True, True, True], dtype=bool)
>>> A_2 >= 30
array([False, True, True], dtype=bool)
>>> ((A_1 >= 30).sum() == A_1.size).astype(np.int)
1
>>> ((A_2 >= 30).sum() == A_2.size).astype(np.int)
0
Вы также можете сделать что-то вроде:
len([*filter(lambda x: x >= 30, my_list1)]) > 0
Ответы
Ответ 1
Используйте all()
функцию с выражением генератора:
>>> my_list1 = [30, 34, 56]
>>> my_list2 = [29, 500, 43]
>>> all(i >= 30 for i in my_list1)
True
>>> all(i >= 30 for i in my_list2)
False
Обратите внимание, что эти тесты больше или равны 30, иначе my_list1
тоже не пройдет тест.
Если вы хотите сделать это в функции, вы должны использовать:
def all_30_or_up(ls):
for i in ls:
if i < 30:
return False
return True
например. как только вы найдете значение, которое доказывает, что существует значение ниже 30, вы возвращаете False
и возвращаете True
, если не найдете никаких доказательств обратного.
Аналогично, вы можете использовать функцию any()
, чтобы проверить, соответствует ли хотя бы 1 значение условию.
Ответ 2
... любая причина, по которой вы не можете использовать min()
?
def above(my_list, minimum):
if min(my_list) >= minimum:
print "All values are equal or above", minimum
else:
print "Not all values are equal or above", minimum
Я не знаю, действительно ли это именно то, что вы хотите, но технически, это то, о чем вы просили...
Ответ 3
Существует встроенная функция all
:
all (x > limit for x in my_list)
Ограничить значение, большее, чем должно быть все числа.
Ответ 4
Вы можете использовать all()
:
my_list1 = [30,34,56]
my_list2 = [29,500,43]
if all(i >= 30 for i in my_list1):
print 'yes'
if all(i >= 30 for i in my_list2):
print 'no'
Обратите внимание, что это включает все числа, равные 30 или выше, а не строго выше 30.
Ответ 5
Вы можете сделать следующее:
def Lists():
my_list1 = [30,34,56]
my_list2 = [29,500,43]
for element in my_list1:
print(element >= 30)
for element in my_list2:
print(element >= 30)
Lists()
Это вернет значения, превышающие 30, как True, и значения, которые меньше как false.
Ответ 6
Общий победитель между использованием np.sum, np.min и всех, по-видимому, является np.min с точки зрения скорости для больших массивов:
N = 1000000
def func_sum(x):
my_list = np.random.randn(N)
return np.sum(my_list < x )==0
def func_min(x):
my_list = np.random.randn(N)
return np.min(my_list) >= x
def func_all(x):
my_list = np.random.randn(N)
return all(i >= x for i in my_list)
(мне нужно поместить определение np.array внутри функции, иначе функция np.min запоминает значение и не выполняет вычисление снова при тестировании скорости с помощью timeit)
Производительность "все" во многом зависит от того, когда первый элемент, который не удовлетворяет критериям, найден, np.sum должен выполнить немного операций, np.min является самым легким с точки зрения вычислений в общий случай.
Когда критерии почти сразу встречаются, и весь цикл выходит быстро, вся функция выигрывает чуть чуть np.min:
>>> %timeit func_sum(10)
10 loops, best of 3: 36.1 ms per loop
>>> %timeit func_min(10)
10 loops, best of 3: 35.1 ms per loop
>>> %timeit func_all(10)
10 loops, best of 3: 35 ms per loop
Но когда "все" нужно пройти через все точки, это определенно намного хуже, а победа np.min:
>>> %timeit func_sum(-10)
10 loops, best of 3: 36.2 ms per loop
>>> %timeit func_min(-10)
10 loops, best of 3: 35.2 ms per loop
>>> %timeit func_all(-10)
10 loops, best of 3: 230 ms per loop
Но используя
np.sum(my_list<x)
может быть очень полезным, нужно знать, сколько значений ниже x.
Ответ 7
Я пишу эту функцию
def larger(x, than=0):
if not x or min(x) > than:
return True
return False
Тогда
print larger([5, 6, 7], than=5) # False
print larger([6, 7, 8], than=5) # True
print larger([], than=5) # True
print larger([6, 7, 8, None], than=5) # False
Пустой список min() приведет к повышению ValueError. Поэтому я добавил if not x
в состояние.