假设我有两个列表(或numpy.array
s):
a = [1,2,3]
b = [4,5,6]
如何检查a
的每个元素是否小于同一索引的b
的相应元素? (我假设指数从0开始)
即
at index 0 value of a = 1 < value of b = 4
at index 1 value of a = 2 < value of b = 5
at index 2 value of a = 3 < value of b = 6
如果a
等于[1,2,7]
,那么这将是不正确的,因为索引2的a
值大于b
的值。如果a
的长度小于b
的长度,则应仅将a
的索引与b
的索引进行比较。
例如,这对a
,b
a = [1,2]
b = [3,4,5]
在索引0和1处,a
的值小于b
,因此这也会通过检查。
P.S .--&GT;我必须在if
语句中使用上述条件。
而且,a
的元素不应该等于b
的元素,即严格来说较小的元素。随意使用尽可能多的工具。 (虽然我在这里使用列表,但您也可以将上面的列表转换为numpy数组。)
答案 0 :(得分:13)
使用zip
和all
all(i < j for (i, j) in zip(a, b))
zip
会将a
开头的值与b
开头的值配对;当较短的iterable耗尽时,迭代结束。当且仅当给定的所有项在布尔上下文中为真时,all
才返回True
。此外,当任何项目失败时,False
将提前返回。
示例结果:
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> all(i < j for (i, j) in zip(a, b))
True
>>> a = [1,2,7]
>>> b = [4,5,6]
>>> all(i < j for (i, j) in zip(a, b))
False
>>> a = [1,2]
>>> b = [4,5,-10]
>>> all(i < j for (i, j) in zip(a, b))
True
使用IPython 3.4.2进行计时:
In [1]: a = [1] * 10000
In [2]: b = [1] * 10000
In [3]: %timeit all(i < j for (i, j) in zip(a, b))
1000 loops, best of 3: 995 µs per loop
In [4]: %timeit all(starmap(lt, zip(a, b)))
1000 loops, best of 3: 487 µs per loop
因此,在这种情况下,星图更快。通常,Python中有两件事情相对较慢:函数调用和全局名称查找。 Retard's solution的starmap
似乎在这里获胜,因为从zip
得到的元组可以按原样作为lt
内置函数的* args,而我的代码需要解构它。
答案 1 :(得分:5)
作为变体,快速和短暂
from operator import lt
from itertools import starmap, izip
all(starmap(lt, izip(a, b)))
答案 2 :(得分:2)
由于此问题的标记为numpy
,我认为我会提供numpy
解决方案。
您只能使用<
长度相同的arrays
运算符,因此,如果您的arrays
长度不同,则需要缩短最长的运算符。
In [26]: import numpy as np
In [27]: a = [1,2,3]
In [28]: b = [4,5,6]
In [29]: np.all(a < b)
Out[29]: True
In [30]: a = [1,2]
In [31]: b = [3,4,5]
In [32]: shortest = min(len(a), len(b))
In [33]: np.all(a[:shortest] < b[:shortest])
Out[33]: True
答案 3 :(得分:1)
只是另一种方式,并不确定它如何与其他答案相比:
a = [1,2,3]
b = [4,5,6]
if filter(lambda x: x[0] < x[1], zip(a,b)):
return True
我在if语句中使用它,因为问题表明,它会像那样使用,并且不需要在那里进行bool转换。否则我会将过滤器()包裹在bool()中。 同样,这只是为了展示一种替代方法,而不是最有效的方法。