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列表是否为空。但不适合我。有谁知道我可以用什么代码检查列表是否为空?
感谢。
答案 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 == []