0
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 列表是否为空。但不为我工作。有谁知道我可以使用什么代码来检查列表是否为空?谢谢。

4

6 回答 6

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
于 2012-08-20T06:26:18.270 回答
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 的速度才会明显更快(我已经删除了之前的当列表只包含 10 个项目时,它总是变慢的时间),条件评估为True 并且 搜索值在列表中很早就达到了。否则,所有 Python 级别的比较都会大大降低速度。

于 2012-08-20T06:21:29.440 回答
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
于 2012-08-20T06:48:09.460 回答
3

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

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 的每个元素的索引列表,其中该元素大于 n。

于 2012-08-20T06:29:51.983 回答
1
>>> plist = []
>>> not plist
True

not list为我工作

于 2012-08-20T06:20:13.290 回答
-1

如果 nums 为空,控件将不会进入循环。因此,您可以忽略该检查(除非您在同一循环中修改 nums,否则不建议这样做)

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

nums == []
于 2012-08-20T06:21:50.763 回答