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

Убедитесь, что все значения в списке больше определенного номера

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
4b9b3361

Ответ 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 в состояние.