Pal*_*uja 8 python numpy list python-itertools python-3.x
假设我有两个列表(或numpy.arrays):
a = [1,2,3]
b = [4,5,6]
Run Code Online (Sandbox Code Playgroud)
如何检查每个元素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
Run Code Online (Sandbox Code Playgroud)
如果a等于[1,2,7],则那将是不正确的,因为索引2的值a大于b.如果a长度比任何长度小b,它应该只比较指数a和b.
例如这对a,b
a = [1,2]
b = [3,4,5]
Run Code Online (Sandbox Code Playgroud)
在索引0和1处,值a小于b,因此这也将通过检查.
PS - >我必须在if声明中使用上述条件.而且,没有任何元素a应该等于b严格较小的元素.随意使用尽可能多的工具.(虽然我在这里使用列表,但您也可以将上面的列表转换为numpy数组.)
Ant*_*ala 14
用zip和回答两个部分all
all(i < j for (i, j) in zip(a, b))
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
与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
Run Code Online (Sandbox Code Playgroud)
因此,在这种情况下,星图更快.通常,Python中有两件事情相对较慢:函数调用和名称查找.该starmap的推后的解决方案,似乎在这里夺冠正是因为从产生的元组zip,可以供给作为,是为*参数传递给了lt内置函数,而我的代码需要解构它.
作为变体,快速和短
from operator import lt
from itertools import starmap, izip
all(starmap(lt, izip(a, b)))
Run Code Online (Sandbox Code Playgroud)