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


81
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)分配的boolean变量是函数的局部变量(因为没有适当的global注释),2)boolean = 0分配而不是比较。
user2864740

请注意,您my_list1一个大于30的值。它等于30。应该等于31,还是在这里测试大于或等于30?
马丁·彼得斯

Answers:


140

将此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值,便返回FalseTrue如果没有发现相反的证据,则返回。

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


使用all_30_or_upover有all什么好处?一旦all发现负数,是否也不应停止使用迭代器?否则会很愚蠢,不是吗?
Hyperboreus

1
@Hyperboreus:发现负数后,两者都会停止。我想给OP提供解决问题的另一种方法,给他们一个替代他们正在编写的函数的功能。
马丁·彼得

@ MartijnPieters,Mucho <3
zelusp '16

9

...您无法使用的任何原因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
该解决方案的缺点是必须触摸列表的每个项目。
Hyperboreus

2
我对此做了一些分析。all短路,因此如果列表不符合要求,则会更快。但是,如果列表全部超过30,min则速度可能会更快。我测试了两个1000个元素的随机整数列表,一个用random.randint(0, 100)(失败)填充,另一个用填充random.randint(30, 100)。使用min时间不到30-100列表中时间的一半。但是all花费min了0-100名单上2%的时间,因此除非失败名单非常罕见,否则它可能会获胜。
Peter DeGlopper

1
事实证明,我的0-100列表中的第一个元素低于30,所以我的测试有点退化。强制第一个sub-30元素进入列表的一半,min出来的速度更快-10000次重复的时间为0.25秒,而不是0.32秒all。因此,如您所料,哪个更快取决于数据的性质。
Peter DeGlopper

4

有一个内置函数all

all (x > limit for x in my_list)

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


至于my_list1应该测试True,测试应该几乎可以肯定>= 30,没有> 30
马丁·彼得

1
好吧,当OP的问题文本自相矛盾时,我该判断谁才是正确的极限。
Hyperboreus

3

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


至于my_list1应该测试True,测试应该几乎可以肯定>= 30,没有> 30
马丁·彼得

@MartijnPieters谢谢,现在已更新。问题提到30岁以上,但>= 30似乎是有意的。
Simeon Visser

我知道,这就是为什么我将其明确。:-)
马丁·彼得

2

就大型阵列的速度而言,使用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进行速度测试时不会再次执行计算)

“ all”的性能在很大程度上取决于何时找到不满足标准的第一个元素,np.sum需要进行一些操作,在一般情况下,np.min在计算方面最轻。

当几乎立即满足条件并且all循环快速退出时,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

但是,当“所有”都需要经过所有要点时,这肯定会更糟,并且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之下有多少个值可能非常有用。


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。


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了条件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.