给定一个包含整数的列表a和B,我希望两个列表进行比较,如果列表a的至少一个元素小于列表B的至少一个元素,则返回true,否则返回False。
例子:
>>> A = [1,4]
>>> B = [0,2]
>>> compare_lists(A, B) # True because 1 from list A < 2 from list B
>>> A = [2,4]
>>> B = [0,2]
>>> compare_lists(A, B) # False because all elements of A are greater or equal to all B elements
这个函数最直接的实现:
def compare_lists(a, b):
for i in a:
for j in b:
if i < j:
return True
return False
我不认为这可以增强性能,但是是否有更好的方法使用Python来实现相同的结果,使用一行代码?
您只需知道A
中的最小值是否小于B
中的最大值,因此以下内容就足够了-
return min(A) < max(B)
嵌套的for
循环可以转换为列表推导,any
函数允许检查至少一个True
A = [1,4]
B = [0,2]
print(any(i < j for i in A for j in B)) # True
A = [2,4]
B = [0,2]
print(any(i < j for i in A for j in B)) # False
any
短路(即一旦遇到真值就结束处理)
如果您将其他两个答案组合在一起,您将得到一个解决方案,该解决方案在一个列表上迭代一次,在另一个列表上迭代至多一次,但可能不检查每个元素:
maxB = max(B)
return any(number < maxB for number in A)
你也可以先检查哪个列表更短,然后在第一步中选择这个列表来找到最大值(如果它是B)或最小值(如果它是A),然后在更长的列表上迭代。
如果列表很长,并且即使没有查看所有元素,条件也很可能满足,您可以通过同时遍历两个列表并在每一步中更新到目前为止找到的最小值和最大值来进一步优化。一旦A的最小值是<到目前为止找到的B的最大值,您可以停止并返回True。最坏的情况是,像上面的解决方案一样,不满足条件,在这种情况下,两个列表都只遍历一次。>