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

O.r*_*rka 59 python function list max

my_list1 = [30,34,56]
my_list2 = [29,500,43]
Run Code Online (Sandbox Code Playgroud)

如何检查列表中的所有值是否> = 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

你也可以这样做:

len([*filter(lambda x: x >= 30, my_list1)]) > 0
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 105

将该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
Run Code Online (Sandbox Code Playgroud)

请注意,此测试大于或等于 30,否则my_list1也不会通过测试.

如果你想在一个函数中这样做,你可以使用:

def all_30_or_up(ls):
    for i in ls:
        if i < 30:
            return False
    return True
Run Code Online (Sandbox Code Playgroud)

例如,一旦您找到证明价值低于30 值,您就会返回False,True如果您没有找到相反的证据则返回.

同样,您可以使用该any()函数来测试至少1个值是否与条件匹配.

  • @Hyperboreus:一旦发现阴性,两者都会停止。我想为 OP 提供一种不同的看待问题的方式,为他们提供一个函数来替换他们正在编写的函数。 (2认同)

Hyp*_*eus 7

有一个内置函数all

all (x > limit for x in my_list)
Run Code Online (Sandbox Code Playgroud)

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


Rob*_*rto 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
Run Code Online (Sandbox Code Playgroud)

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

  • 这种解决方案的缺点是,必须触及列表中的每一项。 (2认同)
  • 我对此做了一些分析。`all` 短路,所以如果列表不合格,它会快得多。但是如果列表都是 30+,`min` 会更快。我用两个包含 1000 个元素的随机整数列表进行了测试,一个填充了 `random.randint(0, 100)`(失败),另一个填充了 `random.randint(30, 100)`。在 30-100 列表中使用 `min` 的时间略少于一半。但是 `all` 在 0-100 列表上花费了 `min` 大约 2% 的时间,所以它可能会赢,除非失败的列表非常罕见。 (2认同)

Sim*_*ser 5

您可以使用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'
Run Code Online (Sandbox Code Playgroud)

请注意,这包括等于 30 或更高的所有数字,而不是严格高于 30。