如何在python中比较两个列表

时间:2015-02-27 14:41:52

标签: python list python-3.x numpy itertools

假设我有两个列表(或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的索引进行比较。

例如,这对ab

a = [1,2]
b = [3,4,5]

在索引0和1处,a的值小于b,因此这也会通过检查。

P.S .--&GT;我必须在if语句中使用上述条件。 而且,a的元素不应该等于b的元素,即严格来说较小的元素。随意使用尽可能多的工具。 (虽然我在这里使用列表,但您也可以将上面的列表转换为numpy数组。)

4 个答案:

答案 0 :(得分:13)

使用zipall

回答这两个部分
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 solutionstarmap似乎在这里获胜,因为从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()中。 同样,这只是为了展示一种替代方法,而不是最有效的方法。