检查列表是否为空

时间:2012-08-20 06:17:21

标签: python

def gt(nums, n):

    for c in nums:
        if max(nums) > n:
            return True

        elif max(nums) < n:
            return False

        elif not nums:
            return False

对于最后一个elif,它应该验证nums列表是否为空。但不适合我。有谁知道我可以用什么代码检查列表是否为空? 感谢。

6 个答案:

答案 0 :(得分:7)

您的方法可以简化为:

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

答案 1 :(得分:6)

您需要先检查not nums。而且您不需要for循环。

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

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

编辑:一些时间安排(Python 2.7.3):

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

所以Burhan和我的解决方案在速度方面是相同的(不是很令人惊讶,因为它们完全相同,我的只是更冗长),而gnibbler明显更快只有 list足够长(我删除了以前的时间,当列表只包含10个项目时,它总是慢一些),条件评估为True 很早就达到了搜索值列表。否则,所有Python级别的比较都会减慢它的速度。

答案 2 :(得分:4)

即使第一个或第二个元素大于max()

nums也必须搜索整个n。当找到大于any()的元素时,n会立即返回

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

答案 3 :(得分:3)

我认为你正在混淆其他语言需要使用max函数循环遍历数组(Python中的列表或元组或其他序列)。

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

>>> max([1,2,3])
3
>>> l=[1,2,22]
>>> max(l)
22
>>> max('abc')
'c'

所以你的功能可以这样做:

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

或者,如果max被带走,或者你只是想看到一个循环:

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

    return False        

现在您不需要检查列表是否为空,因为如果是for循环则永远不会执行。

要考虑的最后一种形式:

>>> nums=[1,5,5,1,5,1,1,1]
>>> n=2
>>> [i for i,x in enumerate(nums) if x>n]
[1, 2, 4]

这是nums的每个元素的索引列表,其中该元素使用list comprehension和enumerate大于n。

答案 4 :(得分:1)

>>> plist = []
>>> not plist
True

not list适合我

答案 5 :(得分:-1)

如果nums为空,控件不会进入循环内部。所以,你可以忽略那个检查(除非你在同一个循环中修改nums,这是不推荐的)

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

nums == []