Python 检查列表是否为空 def gt(nums,n): 对于NUM中的c: 如果最大值(nums)>n: 返回真值 elif max(nums)

Python 检查列表是否为空 def gt(nums,n): 对于NUM中的c: 如果最大值(nums)>n: 返回真值 elif max(nums),python,Python,对于最后一个elif,它应该验证NUM列表是否为空。但不是为我工作。有人知道我可以用什么代码检查列表是否为空吗? 谢谢 非列表适用于我您需要先检查非nums。对于循环,您不需要 请注意,这(与您的代码一样)不会显式检查max(nums)==n,在这种情况下返回False(我认为这应该是名为gt()的函数的正确行为): 编辑:一些计时(Python 2.7.3): 因此,Burhan和我的解决方案在速度方面是等价的(这并不奇怪,因为他们做的事情完全相同,我的只是更详细一点),而gnibbler的

对于最后一个
elif
,它应该验证NUM列表是否为空。但不是为我工作。有人知道我可以用什么代码检查列表是否为空吗? 谢谢


非列表
适用于我

您需要先检查
非nums
。对于循环,您不需要

请注意,这(与您的代码一样)不会显式检查
max(nums)==n
,在这种情况下返回
False
(我认为这应该是名为
gt()
的函数的正确行为):


编辑:一些计时(Python 2.7.3):


因此,Burhan和我的解决方案在速度方面是等价的(这并不奇怪,因为他们做的事情完全相同,我的只是更详细一点),而gnibbler的速度明显更快,只有在列表足够长的情况下(我删除了以前的计时,当列表只包含十个项目时,它总是慢一些),该条件的计算结果为
True
,并且在列表中很早就达到了搜索值。否则,所有Python级别的比较都会大大降低速度。

如果nums为空,则控件不会进入循环。因此,您可以忽略该检查(除非您在同一循环中修改NUM,这是不推荐的)

但是,要回答您的问题,请使用:

>>> import timeit
>>> all = """l = list(range(100))
... rl = list(reversed(range(100)))
... """
>>> tim = all + """def gt(nums, n):
...     if not nums:
...         return False
...     return max(nums) > n"""
>>> gnibbler = all + """def gt(nums, n):
...     return any(x>n for x in nums)"""
>>> burhan = all + """def gt(nums, n):
...   return max(nums) > n if nums else False"""
>>> # Test with the condition being False:
... timeit.timeit(setup=tim, stmt="gt(l, 100)")
3.011574096311698
>>> timeit.timeit(setup=gnibbler, stmt="gt(l, 100)")
8.00847921677337
>>> timeit.timeit(setup=burhan, stmt="gt(l, 100)")
2.9805757305956178
>>> timeit.timeit(setup=tim, stmt="gt(rl, 100)")
2.8600606448831307
>>> timeit.timeit(setup=gnibbler, stmt="gt(l, 100)")
7.997938412127745
>>> timeit.timeit(setup=burhan, stmt="gt(l, 100)")
3.032805185133668
>>> # Now what if the condition is True?
... timeit.timeit(setup=tim, stmt="gt(l, 98)")
2.98623750798793
>>> timeit.timeit(setup=gnibbler, stmt="gt(l, 98)")
8.265056412191534
>>> timeit.timeit(setup=burhan, stmt="gt(l, 98)")
2.9731271156252888
>>> timeit.timeit(setup=tim, stmt="gt(rl, 98)")
2.8777295865334764
>>> timeit.timeit(setup=gnibbler, stmt="gt(rl, 98)")
1.0481696827076092
>>> timeit.timeit(setup=burhan, stmt="gt(rl, 98)")
2.8776150752220246

您的方法可以简化为:

nums == []

我认为您将其他语言循环数组(Python中的列表、元组或其他序列)的需要与函数混为一谈

Python中的Max()获取一个列表或序列并返回最大值。注意--无需循环:

def gt(nums, n):
  return max(nums) > n if nums else False

>>> gt([],0)
False
>>> gt([1,2,3],6)
False
>>> gt([1,2,3],1)
True
因此,您的功能可以通过以下方式完成:

>>> max([1,2,3])
3
>>> l=[1,2,22]
>>> max(l)
22
>>> max('abc')
'c'
或者,如果max被从您身边带走,或者您只想看到此项的循环:

def gt(nums, n): 
    if nums and max(nums) > n:
        return True
    return False
现在不需要检查列表是否为空,因为如果为空,则永远不会执行for循环

需要考虑的最后一种形式:

def gt(nums, n): 
    for num in nums:
        if num>n:
            return True   

    return False        
这是nums中每个元素的索引列表,其中该元素大于n,使用列表理解和枚举

max()
被强制搜索整个
nums
,即使第一个或第二个元素大于
n
<当找到大于
n
的元素时,code>any()将立即返回

>>> nums=[1,5,5,1,5,1,1,1]
>>> n=2
>>> [i for i,x in enumerate(nums) if x>n]
[1, 2, 4]
测试用例
查看函数。如果
max(nums)==n,会发生什么情况?您想做什么?我不认为这些答案对你有用,因为不清楚你想要什么样的行为。您是否正在尝试检查NUM中的所有值是否都大于n?如果是这样,您需要确保在循环完成之前不会返回True。如果不检查单个元素,就没有理由通过NUM循环。
nums=[]
可能应该避免:代码的其余部分(如果有意义的话)对元组或集合也同样满意。很好,+1。另一方面,如果您有一个长数组,其中只有最后一项大于
n
,那么您将进行大量比较。不知道哪一个会更快…嗯。我刚刚做了一些计时测试,结果令人惊讶。你能解释一下吗?我原以为您的解决方案会快得多。@TimPietzcker,
max
无论如何都会进行大量比较,但它们是在“C”级别完成的,因此比短列表的生成器表达式快得多。在CPython中,当列表中有大约100个元素时,您将看到最有利于
any
。pypy可能有更接近的结果。通过使用
imap
partial
操作符,可以在一定程度上提高
any
的速度。另一方面,如果
nums
本身就是一个生成器,
any
可以节省生成您不需要的数字的费用。啊,谢谢。我用更长的列表重新运行了测试。现在,您可以在解决方案的最佳方案中看到显著的性能提高。
def gt(nums, n): 
    if nums and max(nums) > n:
        return True
    return False
def gt(nums, n): 
    for num in nums:
        if num>n:
            return True   

    return False        
>>> nums=[1,5,5,1,5,1,1,1]
>>> n=2
>>> [i for i,x in enumerate(nums) if x>n]
[1, 2, 4]
def gt(nums, n):
    return any(x>n for x in nums)
>>> gt([],0)
False
>>> gt([1,2,3],6)
False
>>> gt([1,2,3],1)
True