检查列表中的两个数字,而无需以最短的人类可读方式两次浏览列表

时间:2018-09-24 20:23:18

标签: python python-3.x list for-loop

所以,我想检查整数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

如果有可能创建一个较短的单行,最多迭代一次该列表,并且易于阅读,那么我将不胜感激。

1 个答案:

答案 0 :(得分:0)

这里的主要问题是,您似乎要求numslist,其中-由于整数是可哈希的-,因此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即可,并且可以使用快速可读的结构。