检查列表中的所有值是否都大于某个数字

时间:2013-11-26 23:01:19

标签: python list function max

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

8 个答案:

答案 0 :(得分:94)

all() function与生成器表达式一起使用:

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

e.g。只要您找到一个证明 值低于30的值,就会返回False,如果您没有找到相反的证据,则返回True

同样,您可以使用any() function来测试至少1个值是否符合条件。

答案 1 :(得分:7)

...您无法使用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

我不知道这是不是你想要的,但从技术上讲,这就是你要求的......

答案 2 :(得分:3)

内置函数all

all (x > limit for x in my_list)

限制所有数字必须大于的值。

答案 3 :(得分:2)

您可以使用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。

答案 4 :(得分:0)

您可以执行以下操作:

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的值。

答案 5 :(得分:0)

使用np.sum,np.min和all之间的总体胜利者在大型数组的速度方面似乎是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测试速度时不会再次执行计算)

&#34;所有&#34;的表现很大程度上取决于何时找到不满足条件的第一个元素,np.sum需要做一些操作,在一般情况下,np.min在计算方面是最轻的。

当几乎立即满足标准并且全部循环快速退出时,all函数在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

但是当&#34;所有&#34;需要经历所有要点,这肯定要糟糕得多,并且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下面有多少个值。

答案 6 :(得分:0)

我写这个函数

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

答案 7 :(得分:-1)

 a = [[a, 2], [b, 3], [c, 4], [d, 5], [a, 1], [b, 6], [e, 7], [h, 8]]

我需要上面的这个

 a = [[a, 3], [b, 9], [c, 4], [d, 5], [e, 7], [h, 8]]
a.append([0, 0])
for i in range(len(a)):
     for j in range(i + 1, len(a) - 1):
            if a[i][0] == a[j][0]:
                    a[i][1] += a[j][1]
                    del a[j]
a.pop()