关于python:检查列表中的所有值是否都大于某个数字 |
您所在的位置:网站首页 › Python怎么输入列表中的一个数 › 关于python:检查列表中的所有值是否都大于某个数字 |
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: pass2016年更新: 事后看来,在处理速度实际上很重要的较大数据集并利用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 |