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

您所在的位置:网站首页 Python怎么输入列表中的一个数 关于python:检查列表中的所有值是否都大于某个数字

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

2023-12-26 21:05| 来源: 网络整理| 查看: 265

12my_list1 = [30,34,56] my_list2 = [29,500,43]

如何检查列表中的所有值是否均> = 30? my_list1应该起作用,而my_list2应该不起作用。

我唯一想到的是:

1234567891011boolean = 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 ...之后,我会这样做:

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

您还可以执行以下操作:

1len([*filter(lambda x: x >= 30, my_list1)]) > 0 相关讨论 需要注意的一般问题:1)分配的boolean变量在函数本地(因为没有适当的global注释),并且2)boolean = 0是赋值,而不是比较。 请注意,您的my_list1具有一个不大于30的值。它等于30。应该等于31,还是在这里测试大于或等于30?

将all()函数与生成器表达式一起使用:

123456>>> 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也不会通过测试。

如果要在函数中执行此操作,请使用:

12345def all_30_or_up(ls):     for i in ls:         if i = minimum:         print"All values are equal or above", minimum     else:         print"Not all values are equal or above", minimum

我不知道这是否正是您想要的,但是从技术上讲,这就是您要的...

相关讨论 该解决方案的缺点是必须触摸列表的每个项目。 我对此做了一些分析。 all短路,因此如果列表不符合要求,则会更快。但是,如果列表全部为30+,则min可能会更快。我测试了两个1000个元素的随机整数列表,一个用random.randint(0, 100)(失败)填充,另一个用random.randint(30, 100)填充。使用min花费的时间略少于30-100列表中一半的时间。但是all花费的时间大约是min在0-100列表中花费的2%,因此除非失败列表非常罕见,否则它可能会获胜。 你们都是对的!谢谢! 事实证明,我的0-100列表中的第一个元素低于30,因此我的测试有点退化。强制第一个sub-30元素位于列表的一半,min的输出速度更快-10000次重复为0.25s,而对于all为0.32s。因此,如您所料,更快的速度取决于数据的性质。

有一个内置函数all:

1all (x > limit for x in my_list)

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

相关讨论 由于my_list1应该测试True,所以测试几乎应该肯定是>= 30,而不是> 30。 好吧,当OP的问题文本相互矛盾时,我该判断谁才是正确的极限。

您可以使用all():

123456my_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似乎是有意的。 我知道,这就是为什么我将其明确。 :-)

就大型阵列的速度而言,使用np.sum,np.min和所有参数之间的总赢家似乎是np.min:

123456789101112N = 1000000 def func_sum(x):     my_list = np.random.randn(N)     return np.sum(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:

12345678>>> %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会获胜:

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

但是使用

1np.sum(my_list than:         return True     return False

然后

1234print 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。

您可以执行以下操作:

123456789101112def 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。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3