所以,我想检查整数a或b是否在列表中。
无需两次浏览列表,我可以这样做:
def hasab(nums):
for i in nums:
if(i == a or i == b):
return True
return False
但是,我想知道是否可以将其缩短为一两行,但只能找到一种方法来遍历列表两次:
def hasab(nums):
return a in nums or b in nums
如果有可能创建一个较短的单行,最多迭代一次该列表,并且易于阅读,那么我将不胜感激。
答案 0 :(得分:0)
这里的主要问题是,您似乎要求nums
是list
,其中-由于整数是可哈希的-,因此nums
可以/开始为{{1} }。在这种情况下:
set
将是最快的测试方法,在这种情况下,def hasab(nums):
return a in nums or b in nums
不会在in
中“迭代”。将这些值进行散列并以平均set
时间进行测试。加上短路会很快。
当然,O(1)
不应每次都从nums
转换为list
,否则将毫无用处。
对于更多元素(或元素数量未知),您可以考虑使用set
:
any
如果您的数据也以return any(x in nums for x in [a,b,c,d,...])
的形式出现,那么最好的方法是测试两个集合是否不相交:
set
return not nums.isdisjoint(input_set)
仅在内部参数为isdisjoint
时才真正有效(有关详细信息:set issubset performance difference depending on the argument type)
因此,只需确保将set
创建为nums
而不是set
即可,并且可以使用快速可读的结构。